diff --git a/src/github.com/matrix-org/dendrite/syncapi/sync/requestpool.go b/src/github.com/matrix-org/dendrite/syncapi/sync/requestpool.go index 548703738..3e1c92e9b 100644 --- a/src/github.com/matrix-org/dendrite/syncapi/sync/requestpool.go +++ b/src/github.com/matrix-org/dendrite/syncapi/sync/requestpool.go @@ -86,33 +86,37 @@ func (rp *RequestPool) OnIncomingSyncRequest(req *http.Request, device *authtype userStreamListener := rp.notifier.GetListener(*syncReq) defer userStreamListener.Close() - select { - // Wait for notifier to wake us up - case <-userStreamListener.GetNotifyChannel(currPos): - currPos = userStreamListener.GetStreamPosition() - // Or for timeout to expire - case <-timer.C: - // We just need to ensure we get out of the select after reaching the - // timeout, but there's nothing specific we want to do in this case - // apart from that, so we do nothing. - // Or for the request to be cancelled - case <-req.Context().Done(): - return httputil.LogThenError(req, req.Context().Err()) - } + for { + select { + // Wait for notifier to wake us up + case <-userStreamListener.GetNotifyChannel(currPos): + currPos = userStreamListener.GetStreamPosition() + // Or for timeout to expire + case <-timer.C: + // We just need to ensure we get out of the select after reaching the + // timeout, but there's nothing specific we want to do in this case + // apart from that, so we do nothing. + // Or for the request to be cancelled + case <-req.Context().Done(): + return httputil.LogThenError(req, req.Context().Err()) + } - // Note that we don't time out during calculation of sync - // response. This ensures that we don't waste the hard work - // of calculating the sync only to get timed out before we - // can respond + // Note that we don't time out during calculation of sync + // response. This ensures that we don't waste the hard work + // of calculating the sync only to get timed out before we + // can respond - syncData, err = rp.currentSyncForUser(*syncReq, currPos) - if err != nil { - return httputil.LogThenError(req, err) - } + syncData, err = rp.currentSyncForUser(*syncReq, currPos) + if err != nil { + return httputil.LogThenError(req, err) + } - return util.JSONResponse{ - Code: http.StatusOK, - JSON: syncData, + if !syncData.IsEmpty() { + return util.JSONResponse{ + Code: http.StatusOK, + JSON: syncData, + } + } } }