msgstore: post MessageInfo on erroneous fetch
When errors occur during a fetch header request, the requested headers are deleted from pending and no information is given to the UI. Spinners keep spinning, and ultimately as the view is refreshed, the headers are fetched again. This can lead to infinite loops, and extremely long logs. Update the store with a MessageInfo message when an error is received. Have the UI display that the header couldn't be fetched in the message list. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
parent
7473571159
commit
01f80721e2
2 changed files with 17 additions and 1 deletions
|
@ -83,6 +83,10 @@ func ParseMessageFormat(format string, timeFmt string, thisDayTimeFmt string,
|
||||||
thisWeekTimeFmt string, thisYearTimeFmt string, ctx Ctx) (
|
thisWeekTimeFmt string, thisYearTimeFmt string, ctx Ctx) (
|
||||||
string, []interface{}, error,
|
string, []interface{}, error,
|
||||||
) {
|
) {
|
||||||
|
if ctx.MsgInfo.Error != nil {
|
||||||
|
return "", nil,
|
||||||
|
errors.New("(unable to fetch header)")
|
||||||
|
}
|
||||||
retval := make([]byte, 0, len(format))
|
retval := make([]byte, 0, len(format))
|
||||||
var args []interface{}
|
var args []interface{}
|
||||||
|
|
||||||
|
|
|
@ -112,8 +112,9 @@ func (store *MessageStore) FetchHeaders(uids []uint32,
|
||||||
}
|
}
|
||||||
if len(toFetch) > 0 {
|
if len(toFetch) > 0 {
|
||||||
store.worker.PostAction(&types.FetchMessageHeaders{Uids: toFetch}, func(msg types.WorkerMessage) {
|
store.worker.PostAction(&types.FetchMessageHeaders{Uids: toFetch}, func(msg types.WorkerMessage) {
|
||||||
if _, ok := msg.(*types.Error); ok {
|
if msg, ok := msg.(*types.Error); ok {
|
||||||
for _, uid := range toFetch {
|
for _, uid := range toFetch {
|
||||||
|
store.postInvalidMessageInfo(uid, msg.Error)
|
||||||
delete(store.pendingHeaders, uid)
|
delete(store.pendingHeaders, uid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,6 +125,17 @@ func (store *MessageStore) FetchHeaders(uids []uint32,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (store *MessageStore) postInvalidMessageInfo(uid uint32, err error) {
|
||||||
|
logging.Errorf("Unable to fetch header %d: %w", uid, err)
|
||||||
|
info := &models.MessageInfo{
|
||||||
|
Envelope: &models.Envelope{},
|
||||||
|
Flags: []models.Flag{models.SeenFlag},
|
||||||
|
Uid: uid,
|
||||||
|
Error: err,
|
||||||
|
}
|
||||||
|
store.Update(&types.MessageInfo{Info: info})
|
||||||
|
}
|
||||||
|
|
||||||
func (store *MessageStore) FetchFull(uids []uint32, cb func(*types.FullMessage)) {
|
func (store *MessageStore) FetchFull(uids []uint32, cb func(*types.FullMessage)) {
|
||||||
// TODO: this could be optimized by pre-allocating toFetch and trimming it
|
// TODO: this could be optimized by pre-allocating toFetch and trimming it
|
||||||
// at the end. In practice we expect to get most messages back in one frame.
|
// at the end. In practice we expect to get most messages back in one frame.
|
||||||
|
|
Loading…
Reference in a new issue