Skip to content

Commit d521ff3

Browse files
authored
feat: speed up getting messages (#731)
* feat: speed up getting messages * fix merge * fix merge
1 parent 36dbd9a commit d521ff3

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

cmd/mailchain/http/handlers/messages.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"time"
2424

2525
"github.com/mailchain/mailchain/cmd/internal/http/params"
26+
"github.com/mailchain/mailchain/crypto/cipher"
2627
"github.com/mailchain/mailchain/encoding"
2728
"github.com/mailchain/mailchain/errs"
2829
"github.com/mailchain/mailchain/internal/addressing"
@@ -72,6 +73,7 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
7273
return
7374
}
7475

76+
decrypters := map[byte]cipher.Decrypter{}
7577
messages := make([]getMessage, len(txs))
7678

7779
for i, tx := range txs {
@@ -94,14 +96,14 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
9496
continue
9597
}
9698

97-
decrypter, err := ks.GetDecrypter(req.addressBytes, req.Protocol, req.Network, decrypterKind, deriveKeyOptions)
99+
decrypter, err := getDecrypter(decrypters, decrypterKind, ks, req.addressBytes, req.Protocol, req.Network, deriveKeyOptions)
98100
if err != nil {
99101
messages[i] = getMessage{Status: errors.WithMessage(err, "could not get `decrypter`").Error(), BlockID: blockID, BlockIDEncoding: blockIDEncoding}
100102

101103
continue
102104
}
103105

104-
message, err := mailbox.ReadMessage(tx.EnvelopeData, decrypter, cache)
106+
message, err := mailbox.ReadMessage(tx.EnvelopeData, decrypter[decrypterKind], cache)
105107
if err != nil {
106108
messages[i] = getMessage{Status: errors.WithMessage(err, "could not read message").Error(), BlockID: blockID, BlockIDEncoding: blockIDEncoding}
107109

@@ -145,6 +147,22 @@ func GetMessages(receivers map[string]mailbox.Receiver, inbox stores.State, cach
145147
}
146148
}
147149

150+
// getting a decrypted from key store can take ~800ms, this reduces the number of times it's fetched
151+
func getDecrypter(decrypters map[byte]cipher.Decrypter, kind byte, ks keystore.Store, address []byte, protocol, network string, deriveKeyOptions multi.OptionsBuilders) (map[byte]cipher.Decrypter, error) {
152+
if _, ok := decrypters[kind]; ok {
153+
return decrypters, nil
154+
}
155+
156+
decrypter, err := ks.GetDecrypter(address, protocol, network, kind, deriveKeyOptions)
157+
if err != nil {
158+
return nil, errors.WithMessage(err, "could not get `decrypter`")
159+
}
160+
161+
decrypters[kind] = decrypter
162+
163+
return decrypters, nil
164+
}
165+
148166
func fetchMessages(ctx context.Context, protocol, network string, address []byte, receivers map[string]mailbox.Receiver, inbox stores.State) error {
149167
receiver, ok := receivers[fmt.Sprintf("%s/%s", protocol, network)]
150168
if !ok {

cmd/mailchain/http/handlers/messages_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func Test_GetMessages(t *testing.T) {
112112

113113
store := keystoretest.NewMockStore(mockCtrl)
114114
store.EXPECT().HasAddress(addressingtest.EthereumCharlotte, "ethereum", "mainnet").Return(true).Times(1)
115-
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil)
115+
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil).Times(1)
116116
return store
117117
}(),
118118
},
@@ -152,7 +152,7 @@ func Test_GetMessages(t *testing.T) {
152152

153153
store := keystoretest.NewMockStore(mockCtrl)
154154
store.EXPECT().HasAddress(addressingtest.EthereumCharlotte, "ethereum", "mainnet").Return(true).Times(1)
155-
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil)
155+
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil).Times(1)
156156
return store
157157
}(),
158158
},
@@ -193,7 +193,7 @@ func Test_GetMessages(t *testing.T) {
193193

194194
store := keystoretest.NewMockStore(mockCtrl)
195195
store.EXPECT().HasAddress(addressingtest.EthereumCharlotte, "ethereum", "mainnet").Return(true).Times(1)
196-
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil)
196+
store.EXPECT().GetDecrypter(addressingtest.EthereumCharlotte, "ethereum", "mainnet", byte(0x73), multi.OptionsBuilders{}).Return(decrypter, nil).Times(1)
197197
return store
198198
}(),
199199
receivers: map[string]mailbox.Receiver{

0 commit comments

Comments
 (0)