aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage/mru/view.go
diff options
context:
space:
mode:
authorJavier Peletier <jpeletier@users.noreply.github.com>2018-09-28 18:07:17 +0800
committerMartin Holst Swende <martin@swende.se>2018-09-28 18:07:17 +0800
commit2c110c81ee92290d3e5ce6134a065c8d2abfbb60 (patch)
treedb263ba1b6f051da8d3e5d0faaafec1c868e453d /swarm/storage/mru/view.go
parent0da3b17a112a75b54c8b3e5a2bf65a27a1c8c999 (diff)
downloadgo-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar.gz
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar.bz2
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar.lz
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar.xz
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.tar.zst
go-tangerine-2c110c81ee92290d3e5ce6134a065c8d2abfbb60.zip
Swarm MRUs: Adaptive frequency / Predictable lookups / API simplification (#17559)
* swarm/storage/mru: Adaptive Frequency swarm/storage/mru/lookup: fixed getBaseTime Added NewEpoch constructor swarm/api/client: better error handling in GetResource() swarm/storage/mru: Renamed structures. Renamed ResourceMetadata to ResourceID. Renamed ResourceID.Name to ResourceID.Topic swarm/storage/mru: Added binarySerializer interface and test tools swarm/storage/mru/lookup: Changed base time to time and + marshallers swarm/storage/mru: Added ResourceID (former resourceMetadata) swarm/storage/mru: Added ResourceViewId and serialization tests swarm/storage/mru/lookup: fixed epoch unmarshaller. Added Epoch Equals swarm/storage/mru: Fixes as per review comments cmd/swarm: reworded resource create/update help text regarding topic swarm/storage/mru: Added UpdateLookup and serializer tests swarm/storage/mru: Added UpdateHeader, serializers and tests swarm/storage/mru: changed UpdateAddr / epoch to Base() swarm/storage/mru: Added resourceUpdate serializer and tests swarm/storage/mru: Added SignedResourceUpdate tests and serializers swarm/storage/mru/lookup: fixed GetFirstEpoch bug swarm/storage/mru: refactor, comments, cleanup Also added tests for Topic swarm/storage/mru: handler tests pass swarm/storage/mru: all resource package tests pass swarm/storage/mru: resource test pass after adding timestamp checking support swarm/storage/mru: Added JSON serializers to ResourceIDView structures swarm/storage/mru: Sever, client, API test pass swarm/storage/mru: server test pass swarm/storage/mru: Added topic length check swarm/storage/mru: removed some literals, improved "previous lookup" test case swarm/storage/mru: some fixes and comments as per review swarm/storage/mru: first working version without metadata chunk swarm/storage/mru: Various fixes as per review swarm/storage/mru: client test pass swarm/storage/mru: resource query strings and manifest-less queries swarm/storage/mru: simplify naming swarm/storage/mru: first autofreq working version swarm/storage/mru: renamed ToValues to AppendValues swarm/resource/mru: Added ToValues / FromValues for URL query strings swarm/storage/mru: Changed POST resource to work with query strings. No more JSON. swarm/storage/mru: removed resourceid swarm/storage/mru: Opened up structures swarm/storage/mru: Merged Request and SignedResourceUpdate swarm/storage/mru: removed initial data from CLI resource create swarm/storage/mru: Refactor Topic as a direct fixed-length array swarm/storage/mru/lookup: Comprehensive GetNextLevel tests swarm/storage/mru: Added comments Added length checks in Topic swarm/storage/mru: fixes in tests and some code comments swarm/storage/mru/lookup: new optimized lookup algorithm swarm/api: moved getResourceView to api out of server swarm/storage/mru: Lookup algorithm working swarm/storage/mru: comments and renamed NewLookupParams Deleted commented code swarm/storage/mru/lookup: renamed Epoch.LaterThan to After swarm/storage/mru/lookup: Comments and tidying naming swarm/storage/mru: fix lookup algorithm swarm/storage/mru: exposed lookup hint removed updateheader swarm/storage/mru/lookup: changed GetNextEpoch for initial values swarm/storage/mru: resource tests pass swarm/storage/mru: valueSerializer interface and tests swarm/storage/mru/lookup: Comments, improvements, fixes, more tests swarm/storage/mru: renamed UpdateLookup to ID, LookupParams to Query swarm/storage/mru: renamed query receiver var swarm/cmd: MRU CLI tests * cmd/swarm: remove rogue fmt * swarm/storage/mru: Add version / header for future use * swarm/storage/mru: Fixes/comments as per review cmd/swarm: remove rogue fmt swarm/storage/mru: Add version / header for future use- * swarm/storage/mru: fix linter errors * cmd/swarm: Speeded up TestCLIResourceUpdate
Diffstat (limited to 'swarm/storage/mru/view.go')
-rw-r--r--swarm/storage/mru/view.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/swarm/storage/mru/view.go b/swarm/storage/mru/view.go
new file mode 100644
index 000000000..2e4ce4a0b
--- /dev/null
+++ b/swarm/storage/mru/view.go
@@ -0,0 +1,125 @@
+// Copyright 2018 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
+
+package mru
+
+import (
+ "hash"
+ "unsafe"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/ethereum/go-ethereum/swarm/storage"
+)
+
+// View represents a particular user's view of a resource
+type View struct {
+ Topic Topic `json:"topic"`
+ User common.Address `json:"user"`
+}
+
+// View layout:
+// TopicLength bytes
+// userAddr common.AddressLength bytes
+const viewLength = TopicLength + common.AddressLength
+
+// mapKey calculates a unique id for this view for the cache map in `Handler`
+func (u *View) mapKey() uint64 {
+ serializedData := make([]byte, viewLength)
+ u.binaryPut(serializedData)
+ hasher := hashPool.Get().(hash.Hash)
+ defer hashPool.Put(hasher)
+ hasher.Reset()
+ hasher.Write(serializedData)
+ hash := hasher.Sum(nil)
+ return *(*uint64)(unsafe.Pointer(&hash[0]))
+}
+
+// binaryPut serializes this View instance into the provided slice
+func (u *View) binaryPut(serializedData []byte) error {
+ if len(serializedData) != viewLength {
+ return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize View. Expected %d, got %d", viewLength, len(serializedData))
+ }
+ var cursor int
+ copy(serializedData[cursor:cursor+TopicLength], u.Topic[:TopicLength])
+ cursor += TopicLength
+
+ copy(serializedData[cursor:cursor+common.AddressLength], u.User[:])
+ cursor += common.AddressLength
+
+ return nil
+}
+
+// binaryLength returns the expected size of this structure when serialized
+func (u *View) binaryLength() int {
+ return viewLength
+}
+
+// binaryGet restores the current instance from the information contained in the passed slice
+func (u *View) binaryGet(serializedData []byte) error {
+ if len(serializedData) != viewLength {
+ return NewErrorf(ErrInvalidValue, "Incorrect slice size to read View. Expected %d, got %d", viewLength, len(serializedData))
+ }
+
+ var cursor int
+ copy(u.Topic[:], serializedData[cursor:cursor+TopicLength])
+ cursor += TopicLength
+
+ copy(u.User[:], serializedData[cursor:cursor+common.AddressLength])
+ cursor += common.AddressLength
+
+ return nil
+}
+
+// Hex serializes the View to a hex string
+func (u *View) Hex() string {
+ serializedData := make([]byte, viewLength)
+ u.binaryPut(serializedData)
+ return hexutil.Encode(serializedData)
+}
+
+// FromValues deserializes this instance from a string key-value store
+// useful to parse query strings
+func (u *View) FromValues(values Values) (err error) {
+ topic := values.Get("topic")
+ if topic != "" {
+ if err := u.Topic.FromHex(values.Get("topic")); err != nil {
+ return err
+ }
+ } else { // see if the user set name and relatedcontent
+ name := values.Get("name")
+ relatedContent, _ := hexutil.Decode(values.Get("relatedcontent"))
+ if len(relatedContent) > 0 {
+ if len(relatedContent) < storage.AddressLength {
+ return NewErrorf(ErrInvalidValue, "relatedcontent field must be a hex-encoded byte array exactly %d bytes long", storage.AddressLength)
+ }
+ relatedContent = relatedContent[:storage.AddressLength]
+ }
+ u.Topic, err = NewTopic(name, relatedContent)
+ if err != nil {
+ return err
+ }
+ }
+ u.User = common.HexToAddress(values.Get("user"))
+ return nil
+}
+
+// AppendValues serializes this structure into the provided string key-value store
+// useful to build query strings
+func (u *View) AppendValues(values Values) {
+ values.Set("topic", u.Topic.Hex())
+ values.Set("user", u.User.Hex())
+}