diff --git a/storage/cmix/store_test.go b/storage/cmix/store_test.go index b1bb2eebcb82ea045b8d7ca8ed5a1b1680da7b5d..33b66b3e12d9651c73812bc949d65ae899bb4ecc 100644 --- a/storage/cmix/store_test.go +++ b/storage/cmix/store_test.go @@ -19,6 +19,9 @@ import ( // Happy path Add/Done test func TestStore_AddRemove(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + //jww.SetStdoutThreshold(jww.LevelTrace) + testStore, _ := makeTestStore() nodeId := id.NewIdFromString("test", id.Node, t) @@ -39,6 +42,9 @@ func TestStore_AddRemove(t *testing.T) { // Happy path func TestLoadStore(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + //jww.SetStdoutThreshold(jww.LevelTrace) + testStore, kv := makeTestStore() // Add a test node key @@ -50,7 +56,7 @@ func TestLoadStore(t *testing.T) { // Load the store and check its attributes store, err := LoadStore(kv) if err != nil { - t.Errorf("Unable to load store: %+v", err) + t.Fatalf("Unable to load store: %+v", err) } if store.GetDHPublicKey().Cmp(testStore.GetDHPublicKey()) != 0 { t.Errorf("LoadStore failed to load public key") @@ -65,6 +71,9 @@ func TestLoadStore(t *testing.T) { // Happy path func TestStore_GetRoundKeys(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + //jww.SetStdoutThreshold(jww.LevelTrace) + testStore, _ := makeTestStore() // Set up the circuit numIds := 10 @@ -90,6 +99,9 @@ func TestStore_GetRoundKeys(t *testing.T) { // Missing keys path func TestStore_GetRoundKeys_Missing(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + //jww.SetStdoutThreshold(jww.LevelTrace) + testStore, _ := makeTestStore() // Set up the circuit numIds := 10 diff --git a/storage/conversation/partner.go b/storage/conversation/partner.go index f13f133b22cd1521e0c6520436dec70cae1d6b6e..e1bd682ded5fae688bf6858ce1d96fe63ef4c61c 100644 --- a/storage/conversation/partner.go +++ b/storage/conversation/partner.go @@ -181,5 +181,5 @@ func (c *Conversation) marshal() ([]byte, error) { } func makeConversationKey(partner *id.ID) string { - return partner.String() + return versioned.MakePartnerPrefix(partner) } diff --git a/storage/conversation/partner_test.go b/storage/conversation/partner_test.go index 0c6091abc3aee7ff1801d7dc3c648879aa878607..caad5518c49fe4e14f6df69a53116f237e8ef828 100644 --- a/storage/conversation/partner_test.go +++ b/storage/conversation/partner_test.go @@ -1,6 +1,7 @@ package conversation import ( + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" @@ -11,6 +12,8 @@ import ( // Tests happy path of LoadOrMakeConversation() when making a new Conversation. func TestLoadOrMakeConversation_Make(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + jww.SetStdoutThreshold(jww.LevelTrace) // Set up test values kv := versioned.NewKV(make(ekv.Memstore)) partner := id.NewIdFromString("partner ID", id.User, t) diff --git a/storage/conversation/store_test.go b/storage/conversation/store_test.go new file mode 100644 index 0000000000000000000000000000000000000000..e391f3949648a9c9cf1429375cb35f43b40be4e7 --- /dev/null +++ b/storage/conversation/store_test.go @@ -0,0 +1,21 @@ +package conversation + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/primitives/id" + "testing" +) + +// Read jww trace output to determine if key names are ok +func TestStore_Get_Prefix(t *testing.T) { + // Uncomment to print keys that Set and Get are called on + jww.SetStdoutThreshold(jww.LevelTrace) + + // It's a conversation with a partner, so does there need to be an additional layer of hierarchy here later? + rootKv := versioned.NewKV(make(ekv.Memstore)) + store := NewStore(rootKv) + conv := store.Get(id.NewIdFromUInt(8, id.User, t)) + t.Log(conv) +} diff --git a/storage/partition/multiPartMessage.go b/storage/partition/multiPartMessage.go index 63d2c7611384fbb0d6d0a0dc83022161187ca5a4..28907664049a63110347cdae002b64d408a188a2 100644 --- a/storage/partition/multiPartMessage.go +++ b/storage/partition/multiPartMessage.go @@ -2,19 +2,19 @@ package partition import ( "encoding/json" + "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/xx_network/primitives/id" - "strconv" "sync" "time" ) const currentMultiPartMessageVersion = 0 -const keyMultiPartMessagePrefix = "MultiPartMessage" +const messageKey = "MultiPart" type multiPartMessage struct { Sender *id.ID @@ -33,9 +33,9 @@ type multiPartMessage struct { // creates a new one and saves it if one does not exist. func loadOrCreateMultiPartMessage(sender *id.ID, messageID uint64, kv *versioned.KV) *multiPartMessage { - key := makeMultiPartMessageKey(sender, messageID) + kv = kv.Prefix(versioned.MakePartnerPrefix(sender)).Prefix(fmt.Sprintf("MessageID:%d", messageID)) - obj, err := kv.Get(key) + obj, err := kv.Get(messageKey) if err != nil { if !ekv.Exists(err) { mpm := &multiPartMessage{ @@ -70,8 +70,6 @@ func loadOrCreateMultiPartMessage(sender *id.ID, messageID uint64, } func (mpm *multiPartMessage) save() error { - key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID) - data, err := json.Marshal(mpm) if err != nil { return errors.Wrap(err, "Failed to unmarshal multi-part message") @@ -83,7 +81,7 @@ func (mpm *multiPartMessage) save() error { Data: data, } - return mpm.kv.Set(key, &obj) + return mpm.kv.Set(messageKey, &obj) } func (mpm *multiPartMessage) Add(partNumber uint8, part []byte) { @@ -98,7 +96,7 @@ func (mpm *multiPartMessage) Add(partNumber uint8, part []byte) { mpm.parts[partNumber] = part mpm.PresentParts++ - if err := savePart(mpm.kv, mpm.Sender, mpm.MessageID, partNumber, part); err != nil { + if err := savePart(mpm.kv, partNumber, part); err != nil { jww.FATAL.Panicf("Failed to save multi part "+ "message part %v from %s messageID %v: %s", partNumber, mpm.Sender, mpm.MessageID, err) @@ -127,9 +125,10 @@ func (mpm *multiPartMessage) AddFirst(mt message.Type, partNumber uint8, mpm.parts[partNumber] = part mpm.PresentParts++ - if err := savePart(mpm.kv, mpm.Sender, mpm.MessageID, partNumber, part); err != nil { - jww.FATAL.Panicf("Failed to save multi part message part %v from %s "+ - "messageID %v: %s", partNumber, mpm.Sender, mpm.MessageID, err) + if err := savePart(mpm.kv, partNumber, part); err != nil { + jww.FATAL.Panicf("Failed to save multi part "+ + "message part %v from %s messageID %v: %s", partNumber, mpm.Sender, + mpm.MessageID, err) } if err := mpm.save(); err != nil { @@ -156,13 +155,15 @@ func (mpm *multiPartMessage) IsComplete() (message.Receive, bool) { // Load all parts from disk, deleting files from disk as we go along for i := uint8(0); i < mpm.NumParts; i++ { if mpm.parts[i] == nil { - if mpm.parts[i], err = loadPart(mpm.kv, mpm.Sender, mpm.MessageID, i); err != nil { - jww.FATAL.Panicf("Failed to load multi part message part %v "+ - "from %s messageID %v: %s", i, mpm.Sender, mpm.MessageID, err) + if mpm.parts[i], err = loadPart(mpm.kv, i); err != nil { + jww.FATAL.Panicf("Failed to load multi part "+ + "message part %v from %s messageID %v: %s", i, mpm.Sender, + mpm.MessageID, err) } - if err = deletePart(mpm.kv, mpm.Sender, mpm.MessageID, i); err != nil { - jww.FATAL.Panicf("Failed to delete multi part message part %v "+ - "from %s messageID %v: %s", i, mpm.Sender, mpm.MessageID, err) + if err = deletePart(mpm.kv, i); err != nil { + jww.FATAL.Panicf("Failed to delete multi part "+ + "message part %v from %s messageID %v: %s", i, mpm.Sender, + mpm.MessageID, err) } } lenMsg += len(mpm.parts[i]) @@ -194,15 +195,10 @@ func (mpm *multiPartMessage) IsComplete() (message.Receive, bool) { } func (mpm *multiPartMessage) delete() { - key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID) - if err := mpm.kv.Delete(key); err != nil { + //key := makeMultiPartMessageKey(mpm.MessageID) + if err := mpm.kv.Delete(messageKey); err != nil { jww.FATAL.Panicf("Failed to delete multi part "+ "message from %s messageID %v: %s", mpm.Sender, mpm.MessageID, err) } } - -func makeMultiPartMessageKey(partner *id.ID, messageID uint64) string { - return keyMultiPartMessagePrefix + ":" + partner.String() + ":" + - strconv.FormatUint(messageID, 10) -} diff --git a/storage/partition/multiPartMessage_test.go b/storage/partition/multiPartMessage_test.go index 6f164b6d11869f207930741339e7a17362f21800..c5577e4ec8f6862e324b072a71439e66ad2aeae3 100644 --- a/storage/partition/multiPartMessage_test.go +++ b/storage/partition/multiPartMessage_test.go @@ -3,6 +3,7 @@ package partition import ( "bytes" "encoding/json" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" @@ -15,6 +16,7 @@ import ( // Tests the creation part of loadOrCreateMultiPartMessage(). func Test_loadOrCreateMultiPartMessage_Create(t *testing.T) { + jww.SetStdoutThreshold(jww.LevelTrace) // Set up expected test value prng := rand.New(rand.NewSource(time.Now().UnixNano())) expectedMpm := &multiPartMessage{ @@ -35,14 +37,9 @@ func Test_loadOrCreateMultiPartMessage_Create(t *testing.T) { mpm := loadOrCreateMultiPartMessage(expectedMpm.Sender, expectedMpm.MessageID, expectedMpm.kv) - if !reflect.DeepEqual(expectedMpm, mpm) { - t.Errorf("loadOrCreateMultiPartMessage() did not create the correct "+ - "multiPartMessage.\n\texpected: %+v\n\treceived: %+v", - expectedMpm, mpm) - } + CheckMultiPartMessages(expectedMpm, mpm, t) - obj, err := expectedMpm.kv.Get(makeMultiPartMessageKey(expectedMpm.Sender, - expectedMpm.MessageID)) + obj, err := mpm.kv.Get(messageKey) if err != nil { t.Errorf("Get() failed to get multiPartMessage from key value store: %v", err) } @@ -76,10 +73,36 @@ func Test_loadOrCreateMultiPartMessage_Load(t *testing.T) { mpm := loadOrCreateMultiPartMessage(expectedMpm.Sender, expectedMpm.MessageID, expectedMpm.kv) - if !reflect.DeepEqual(expectedMpm, mpm) { - t.Errorf("loadOrCreateMultiPartMessage() did not create the correct "+ - "multiPartMessage.\n\texpected: %+v\n\treceived: %+v", - expectedMpm, mpm) + CheckMultiPartMessages(expectedMpm, mpm, t) +} + +func CheckMultiPartMessages(expectedMpm *multiPartMessage, mpm *multiPartMessage, t *testing.T) { + // The kv differs because it has prefix called, so we compare fields individually + if expectedMpm.Timestamp != mpm.Timestamp { + t.Errorf("timestamps mismatch: expected %v, got %v", expectedMpm.Timestamp, mpm.Timestamp) + } + if expectedMpm.MessageType != mpm.MessageType { + t.Errorf("messagetype mismatch: expected %v, got %v", expectedMpm.MessageID, mpm.MessageID) + } + if expectedMpm.MessageID != mpm.MessageID { + t.Errorf("messageid mismatch: expected %v, got %v", expectedMpm.MessageID, mpm.MessageID) + } + if expectedMpm.NumParts != mpm.NumParts { + t.Errorf("numparts mismatch: expected %v, got %v", expectedMpm.NumParts, mpm.NumParts) + } + if expectedMpm.PresentParts != mpm.PresentParts { + t.Errorf("presentparts mismatch: expected %v, got %v", expectedMpm.PresentParts, mpm.PresentParts) + } + if !expectedMpm.Sender.Cmp(mpm.Sender) { + t.Errorf("sender mismatch: expected %v, got %v", expectedMpm.Sender, mpm.Sender) + } + if len(expectedMpm.parts) != len(mpm.parts) { + t.Error("parts different length") + } + for i := range expectedMpm.parts { + if !bytes.Equal(expectedMpm.parts[i], mpm.parts[i]) { + t.Errorf("parts differed at index %v", i) + } } } @@ -112,7 +135,7 @@ func TestMultiPartMessage_Add(t *testing.T) { t.Fatalf("Failed to marshal expected multiPartMessage: %v", err) } - obj, err := mpm.kv.Get(makeMultiPartMessageKey(mpm.Sender, mpm.MessageID)) + obj, err := mpm.kv.Get(messageKey) if err != nil { t.Errorf("Get() failed to get multiPartMessage from key value store: %v", err) } @@ -145,12 +168,9 @@ func TestMultiPartMessage_AddFirst(t *testing.T) { npm.AddFirst(expectedMpm.MessageType, 2, expectedMpm.NumParts, expectedMpm.Timestamp, expectedMpm.parts[2]) - if !reflect.DeepEqual(expectedMpm, npm) { - t.Errorf("AddFirst() did not produce correct multiPartMessage."+ - "\n\texpected: %#v\n\treceived: %#v", expectedMpm, npm) - } + CheckMultiPartMessages(expectedMpm, npm, t) - data, err := loadPart(npm.kv, npm.Sender, npm.MessageID, 2) + data, err := loadPart(npm.kv, 2) if err != nil { t.Errorf("loadPart() produced an error: %v", err) } @@ -213,13 +233,12 @@ func TestMultiPartMessage_delete(t *testing.T) { kv := versioned.NewKV(make(ekv.Memstore)) mpm := loadOrCreateMultiPartMessage(id.NewIdFromUInt(prng.Uint64(), id.User, t), prng.Uint64(), kv) - key := makeMultiPartMessageKey(mpm.Sender, mpm.MessageID) mpm.delete() - obj, err := kv.Get(key) + obj, err := kv.Get(messageKey) if ekv.Exists(err) { t.Errorf("delete() did not properly delete key %s."+ - "\n\tobject received: %+v", key, obj) + "\n\tobject received: %+v", messageKey, obj) } } diff --git a/storage/partition/part.go b/storage/partition/part.go index 11c502e88c3cf381cd31154be06fe5c803109706..7a6052d96ee8f2cbd66d89642f0217e5ee5745da 100644 --- a/storage/partition/part.go +++ b/storage/partition/part.go @@ -1,17 +1,15 @@ package partition import ( + "fmt" "gitlab.com/elixxir/client/storage/versioned" - "gitlab.com/xx_network/primitives/id" - "strconv" "time" ) const currentMultiPartMessagePartVersion = 0 -const keyMultiPartMessagePartPrefix = "MultiPartMessagePart" -func loadPart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8) ([]byte, error) { - key := makeMultiPartMessagePartKey(partner, messageID, partNum) +func loadPart(kv *versioned.KV, partNum uint8) ([]byte, error) { + key := makeMultiPartMessagePartKey(partNum) obj, err := kv.Get(key) if err != nil { @@ -21,8 +19,8 @@ func loadPart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8) return obj.Data, nil } -func savePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8, part []byte) error { - key := makeMultiPartMessagePartKey(partner, messageID, partNum) +func savePart(kv *versioned.KV, partNum uint8, part []byte) error { + key := makeMultiPartMessagePartKey(partNum) obj := versioned.Object{ Version: currentMultiPartMessagePartVersion, @@ -33,13 +31,17 @@ func savePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8, return kv.Set(key, &obj) } -func deletePart(kv *versioned.KV, partner *id.ID, messageID uint64, partNum uint8) error { - key := makeMultiPartMessagePartKey(partner, messageID, partNum) +func deletePart(kv *versioned.KV, partNum uint8) error { + key := makeMultiPartMessagePartKey(partNum) return kv.Delete(key) } -func makeMultiPartMessagePartKey(partner *id.ID, messageID uint64, partNum uint8) string { - return keyMultiPartMessagePartPrefix + ":" + partner.String() + ":" + - strconv.FormatUint(messageID, 10) + ":" + string(partNum) - +// Make the key for a part +func makeMultiPartMessagePartKey(part uint8) string { + return fmt.Sprintf("part:%v", part) } + +//func multiPartMessagePartPrefix(kv *versioned.KV, id uint64) *versioned.KV { +// return kv.Prefix(keyMultiPartMessagePartPrefix). +// Prefix(strconv.FormatUint(id, 32)) +//} diff --git a/storage/partition/part_test.go b/storage/partition/part_test.go index 8899d634653d6a3019536abae025870822d99d02..d83d528fb4e962d3b2f23f8ae13b1b25c1da33a2 100644 --- a/storage/partition/part_test.go +++ b/storage/partition/part_test.go @@ -2,9 +2,9 @@ package partition import ( "bytes" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" - "gitlab.com/xx_network/primitives/id" "math/rand" "testing" "time" @@ -15,15 +15,13 @@ func Test_savePart(t *testing.T) { // Set up test values prng := rand.New(rand.NewSource(time.Now().UnixNano())) kv := versioned.NewKV(make(ekv.Memstore)) - partner := id.NewIdFromUInt(prng.Uint64(), id.User, t) - messageID := prng.Uint64() partNum := uint8(prng.Uint32()) part := make([]byte, prng.Int31n(500)) prng.Read(part) - key := makeMultiPartMessagePartKey(partner, messageID, partNum) + key := makeMultiPartMessagePartKey(partNum) // Save part - err := savePart(kv, partner, messageID, partNum, part) + err := savePart(kv, partNum, part) if err != nil { t.Errorf("savePart() produced an error: %v", err) } @@ -43,24 +41,23 @@ func Test_savePart(t *testing.T) { // Tests happy path of loadPart(). func Test_loadPart(t *testing.T) { + jww.SetStdoutThreshold(jww.LevelTrace) // Set up test values prng := rand.New(rand.NewSource(time.Now().UnixNano())) - kv := versioned.NewKV(make(ekv.Memstore)) - partner := id.NewIdFromUInt(prng.Uint64(), id.User, t) - messageID := prng.Uint64() + rootKv := versioned.NewKV(make(ekv.Memstore)) partNum := uint8(prng.Uint32()) part := make([]byte, prng.Int31n(500)) prng.Read(part) - key := makeMultiPartMessagePartKey(partner, messageID, partNum) + key := makeMultiPartMessagePartKey(partNum) // Save part to key value store - err := kv.Set(key, &versioned.Object{Timestamp: time.Now(), Data: part}) + err := rootKv.Set(key, &versioned.Object{Timestamp: time.Now(), Data: part}) if err != nil { t.Fatalf("Failed to set object: %v", err) } // Load part from key value store - data, err := loadPart(kv, partner, messageID, partNum) + data, err := loadPart(rootKv, partNum) if err != nil { t.Errorf("loadPart() produced an error: %v", err) } @@ -78,14 +75,12 @@ func Test_loadPart_NotFoundError(t *testing.T) { // Set up test values prng := rand.New(rand.NewSource(time.Now().UnixNano())) kv := versioned.NewKV(make(ekv.Memstore)) - partner := id.NewIdFromUInt(prng.Uint64(), id.User, t) - messageID := prng.Uint64() partNum := uint8(prng.Uint32()) part := make([]byte, prng.Int31n(500)) prng.Read(part) // Load part from key value store - data, err := loadPart(kv, partner, messageID, partNum) + data, err := loadPart(kv, partNum) if ekv.Exists(err) { t.Errorf("loadPart() found an item for the key: %v", err) } @@ -102,26 +97,24 @@ func TestDeletePart(t *testing.T) { // Set up test values prng := rand.New(rand.NewSource(time.Now().UnixNano())) kv := versioned.NewKV(make(ekv.Memstore)) - partner := id.NewIdFromUInt(prng.Uint64(), id.User, t) - messageID := prng.Uint64() partNum := uint8(prng.Uint32()) part := make([]byte, prng.Int31n(500)) prng.Read(part) // Save part - err := savePart(kv, partner, messageID, partNum, part) + err := savePart(kv, partNum, part) if err != nil { t.Fatalf("savePart() produced an error: %v", err) } // Attempt to delete part - err = deletePart(kv, partner, messageID, partNum) + err = deletePart(kv, partNum) if err != nil { t.Errorf("deletePart() produced an error: %v", err) } // Check if part was deleted - _, err = loadPart(kv, partner, messageID, partNum) + _, err = loadPart(kv, partNum) if ekv.Exists(err) { t.Errorf("part was found in key value store: %v", err) } diff --git a/storage/partition/store.go b/storage/partition/store.go index d9935a201a1313eeb1d16711ec8f9e09f16379cd..2b23d2834e905c94b6d11e3ffab764e18d94154e 100644 --- a/storage/partition/store.go +++ b/storage/partition/store.go @@ -12,6 +12,8 @@ import ( type multiPartID [16]byte +const packagePrefix = "Partition" + type Store struct { multiParts map[multiPartID]*multiPartMessage kv *versioned.KV @@ -21,7 +23,7 @@ type Store struct { func New(kv *versioned.KV) *Store { return &Store{ multiParts: make(map[multiPartID]*multiPartMessage), - kv: kv, + kv: kv.Prefix(packagePrefix), } } diff --git a/storage/partition/store_test.go b/storage/partition/store_test.go index c222eead9e9538561eafc51d4ea86c5a5cd3d294..fab54bcd6bc38f6c4c031460cf6c006d6dc1e213 100644 --- a/storage/partition/store_test.go +++ b/storage/partition/store_test.go @@ -2,6 +2,7 @@ package partition import ( "bytes" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/message" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" @@ -13,12 +14,13 @@ import ( // Tests happy path of New(). func TestNew(t *testing.T) { + rootKv := versioned.NewKV(make(ekv.Memstore)) expectedStore := &Store{ multiParts: make(map[multiPartID]*multiPartMessage), - kv: versioned.NewKV(make(ekv.Memstore)), + kv: rootKv.Prefix(packagePrefix), } - store := New(expectedStore.kv) + store := New(rootKv) if !reflect.DeepEqual(expectedStore, store) { t.Errorf("New() did not return the expecte Store."+ @@ -28,6 +30,7 @@ func TestNew(t *testing.T) { // Tests happy path of Store.AddFirst(). func TestStore_AddFirst(t *testing.T) { + jww.SetStdoutThreshold(jww.LevelTrace) part := []byte("Test message.") s := New(versioned.NewKV(ekv.Memstore{})) diff --git a/storage/utility/knownRounds.go b/storage/utility/knownRounds.go index c03f7c433900fc2b7a6f634532374c599bd58baa..472206074e4ccc56cf4e5ecf03b0cadcdbbd00de 100644 --- a/storage/utility/knownRounds.go +++ b/storage/utility/knownRounds.go @@ -10,7 +10,7 @@ import ( ) // Sub key used in building keys for saving the message to the key value store -const knownRoundsSubKey = "knownRound" +const knownRoundsPrefix = "knownRound" // Version of the file saved to the key value store const currentKnownRoundsVersion = 0 @@ -32,7 +32,7 @@ func NewKnownRounds(kv *versioned.KV, key string, size int) (*KnownRounds, error // Create new empty struct kr := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), - kv: kv, + kv: kv.Prefix(knownRoundsPrefix), key: key, } @@ -49,7 +49,7 @@ func LoadKnownRounds(kv *versioned.KV, key string, size int) (*KnownRounds, erro // Create new empty struct kr := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), - kv: kv, + kv: kv.Prefix(knownRoundsPrefix), key: key, } @@ -78,7 +78,7 @@ func (kr *KnownRounds) save() error { } // Save versioned object - return kr.kv.Set(makeKnownRoundsSubKey(kr.key), &obj) + return kr.kv.Set(kr.key, &obj) } // load retrieves the list of rounds from the key value store and stores them @@ -86,7 +86,7 @@ func (kr *KnownRounds) save() error { func (kr *KnownRounds) load() error { // Load the versioned object - vo, err := kr.kv.Get(makeKnownRoundsSubKey(kr.key)) + vo, err := kr.kv.Get(kr.key) if err != nil { return err } @@ -162,8 +162,3 @@ func (kr *KnownRounds) RangeUncheckedMasked(mask *knownRounds.KnownRounds, jww.FATAL.Panicf("Error saving list of checked rounds: %v", err) } } - -// makeKnownRoundsSubKey generates a new key for the known rounds buffer. -func makeKnownRoundsSubKey(key string) string { - return key + knownRoundsSubKey -} diff --git a/storage/utility/knownRounds_test.go b/storage/utility/knownRounds_test.go index 88e153f1e1c8bd4f471a934712d878cd91a90d5d..f6490beef04f57cd4d6858d1a97522e699fe8245 100644 --- a/storage/utility/knownRounds_test.go +++ b/storage/utility/knownRounds_test.go @@ -1,6 +1,7 @@ package utility import ( + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/ekv" "gitlab.com/elixxir/primitives/knownRounds" @@ -13,14 +14,15 @@ import ( func TestNewKnownRounds(t *testing.T) { // Set up expected value size := 10 + rootKv := versioned.NewKV(make(ekv.Memstore)) expectedKR := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), - kv: versioned.NewKV(make(ekv.Memstore)), + kv: rootKv.Prefix(knownRoundsPrefix), key: "testKey", } // Create new KnownRounds - kr, err := NewKnownRounds(expectedKR.kv, expectedKR.key, size) + kr, err := NewKnownRounds(rootKv, expectedKR.key, size) if err != nil { t.Errorf("NewKnownRounds() returned an error."+ "\n\texpected: %v\n\treceived: %v", nil, err) @@ -28,17 +30,19 @@ func TestNewKnownRounds(t *testing.T) { if !reflect.DeepEqual(expectedKR, kr) { t.Errorf("NewKnownRounds() returned an incorrect KnownRounds."+ - "\n\texpected: %v\n\treceived: %v", expectedKR, kr) + "\n\texpected: %+v\n\treceived: %+v", expectedKR, kr) } } // Tests happy path of LoadKnownRounds. func TestLoadKnownRounds(t *testing.T) { + jww.SetStdoutThreshold(jww.LevelTrace) // Set up expected value size := 10 + rootKv := versioned.NewKV(make(ekv.Memstore)) expectedKR := &KnownRounds{ rounds: knownRounds.NewKnownRound(size), - kv: versioned.NewKV(make(ekv.Memstore)), + kv: rootKv.Prefix(knownRoundsPrefix), key: "testKey", } @@ -53,7 +57,7 @@ func TestLoadKnownRounds(t *testing.T) { t.Fatalf("Error saving KnownRounds: %v", err) } - kr, err := LoadKnownRounds(expectedKR.kv, expectedKR.key, size) + kr, err := LoadKnownRounds(rootKv, expectedKR.key, size) if err != nil { t.Errorf("LoadKnownRounds() returned an error."+ "\n\texpected: %v\n\treceived: %v", nil, err) @@ -94,7 +98,7 @@ func TestKnownRounds_save(t *testing.T) { t.Errorf("save() returned an error: %v", err) } - obj, err := expectedKR.kv.Get(makeKnownRoundsSubKey(expectedKR.key)) + obj, err := expectedKR.kv.Get(expectedKR.key) if err != nil { t.Errorf("Get() returned an error: %v", err) } diff --git a/storage/versioned/kv.go b/storage/versioned/kv.go index 3e0fb42ee476abe684af619f3f5be8239eccdb76..cb13324783388d4fe6292ed696ed9027e79934cf 100644 --- a/storage/versioned/kv.go +++ b/storage/versioned/kv.go @@ -8,8 +8,9 @@ package versioned import ( "fmt" - "gitlab.com/elixxir/client/globals" + jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/ekv" + "gitlab.com/xx_network/primitives/id" "strings" ) @@ -21,6 +22,12 @@ func MakeKeyWithPrefix(dataType string, uniqueID string) string { return fmt.Sprintf("%s%s%s", dataType, PrefixSeparator, uniqueID) } +// MakePartnerPrefix creates a string prefix +// to denote who a conversation or relationship is with +func MakePartnerPrefix(id *id.ID) string { + return fmt.Sprintf("Partner:%v", id.String()) +} + // Upgrade functions must be of this type type Upgrade func(key string, oldObject *Object) (*Object, error) @@ -74,9 +81,9 @@ func NewKV(data ekv.KeyValue) *KV { // Make sure to inspect the version returned in the versioned object func (v *KV) Get(key string) (*Object, error) { key = v.prefix + key + jww.TRACE.Printf("Get %p with key %v", v.r.data, key) // Get raw data result := Object{} - globals.Log.TRACE.Println("getting key", key, "in", v.r.data) err := v.r.data.Get(key, &result) if err != nil { return nil, err @@ -98,6 +105,7 @@ func (v *KV) Get(key string) (*Object, error) { // Delete removes a given key from the data store func (v *KV) Delete(key string) error { key = v.prefix + key + jww.TRACE.Printf("Delete %p with key %v", v.r.data, key) return v.r.data.Delete(key) } @@ -106,7 +114,7 @@ func (v *KV) Delete(key string) error { // type optionally unique id! Call MakeKeyWithPrefix() to do so. func (v *KV) Set(key string, object *Object) error { key = v.prefix + key - globals.Log.TRACE.Println("setting key", key, "in", v.r.data) + jww.TRACE.Printf("Set %p with key %v", v.r.data, key) return v.r.data.Set(key, object) }