Skip to content
Snippets Groups Projects
Commit 58018954 authored by Richard T. Carback III's avatar Richard T. Carback III
Browse files

Merge branch 'hotfix/message_id_unique' into 'release'

Make the message id index unique

See merge request !10
parents ea5fde34 e83200b0
No related branches found
No related tags found
2 merge requests!60Revert "Fail a test to be sure it works",!10Make the message id index unique
......@@ -160,11 +160,17 @@ func (w *wasmModel) ReceiveMessage(channelID *id.ID,
// Attempt a lookup on the MessageID if it is non-zero to find an existing
// entry for it. This occurs any time a sender receives their own message
// from the mixnet.
emptyID := cryptoChannel.MessageID{}
jww.DEBUG.Printf("messageID: %s, blank messageID: %s",
messageID.String(),
emptyID)
if !messageID.Equals(cryptoChannel.MessageID{}) {
jww.DEBUG.Printf("non-empty messageID detected")
uuid, err := w.msgIDLookup(messageID)
if err != nil {
// message is already in the database, no insert necessary
return uuid
if err == nil && uuid != 0 {
jww.WARN.Printf("found MessageID, will upsert: %d",
uuid)
msgToInsert.ID = uuid
}
}
......@@ -234,7 +240,7 @@ func (w *wasmModel) ReceiveReaction(channelID *id.ID,
// receives their own message from the mixnet.
if !messageID.Equals(cryptoChannel.MessageID{}) {
uuid, err := w.msgIDLookup(messageID)
if err != nil {
if err == nil {
// message is already in the database, no insert necessary
return uuid
}
......@@ -283,7 +289,7 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, messageID cryptoChannel.Messag
newMessage.MessageID = messageID.Bytes()
}
if round.ID == 0 {
if round.ID != 0 {
newMessage.Round = uint64(round.ID)
}
......@@ -377,7 +383,19 @@ func (w *wasmModel) receiveHelper(newMessage *Message) (uint64,
if err != nil {
return 0, errors.Errorf("Upserting Message failed: %+v", err)
}
res, _ := addReq.Result()
res, err := addReq.Result()
// NOTE: Sometimes the insert fails to return an error but hits
// a duplicate insert, so this fallthrough returns the uuid entry in
// that case.
if res.IsUndefined() {
msgID := cryptoChannel.MessageID{}
copy(msgID[:], newMessage.MessageID)
uuid, errLookup := w.msgIDLookup(msgID)
if uuid != 0 && errLookup == nil {
return uuid, nil
}
return 0, errors.Errorf("uuid lookup failure: %+v", err)
}
uuid := uint64(res.Int())
jww.DEBUG.Printf(
"Successfully stored message from %s, id %d",
......
......@@ -126,7 +126,7 @@ func TestWasmModel_JoinChannel_LeaveChannel(t *testing.T) {
}
}
// Test wasmModel.UpdateSentStatus happy path and ensure fields don't change.
// Test UUID gets returned when different messages are added
func TestWasmModel_UUIDTest(t *testing.T) {
testString := "testHello"
eventModel, err := newWASMModel(testString, dummyCallback)
......@@ -167,3 +167,46 @@ func TestWasmModel_UUIDTest(t *testing.T) {
}
}
}
// TestWasmModel_DuplicateReceives tests if the same message ID being sent
// always returns the same uuid
func TestWasmModel_DuplicateReceives(t *testing.T) {
testString := "testHello"
eventModel, err := newWASMModel(testString, dummyCallback)
if err != nil {
t.Fatalf("%+v", err)
}
cid := channel.Identity{
Codename: "codename123",
PubKey: []byte{8, 6, 7, 5},
Color: "#FFFFFF",
Extension: "gif",
CodesetVersion: 0,
}
uuids := make([]uint64, 10)
msgID := channel.MessageID{}
copy(msgID[:], testString)
for i := 0; i < 10; i++ {
// Store a test message
channelID := id.NewIdFromBytes([]byte(testString), t)
rnd := rounds.Round{ID: id.Round(42)}
uuid := eventModel.ReceiveMessage(channelID, msgID,
"test", testString+fmt.Sprintf("%d", i), cid, time.Now(),
time.Hour, rnd, 0, channels.Sent)
uuids[i] = uuid
}
_, _ = eventModel.dump(messageStoreName)
for i := 0; i < 10; i++ {
for j := i + 1; j < 10; j++ {
if uuids[i] != uuids[j] {
t.Fatalf("uuid failed: %d[%d] != %d[%d]",
uuids[i], i, uuids[j], j)
}
}
}
}
......@@ -102,8 +102,13 @@ func v1Upgrade(db *idb.Database) error {
if err != nil {
return err
}
messageStoreMessageIndexOpts := idb.IndexOptions{
Unique: true,
MultiEntry: false,
}
_, err = messageStore.CreateIndex(messageStoreMessageIndex,
js.ValueOf(messageStoreMessage), indexOpts)
js.ValueOf(messageStoreMessage), messageStoreMessageIndexOpts)
if err != nil {
return err
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment