This commit is contained in:
guochao 2024-12-18 14:17:59 +08:00
parent 2701cf802d
commit 055d113c80

View File

@ -88,7 +88,6 @@ OUTER:
for {
select {
case <-memoryObject.ctx.Done():
logrus.Info("ctx done")
break OUTER
default:
}
@ -98,14 +97,11 @@ OUTER:
time.Sleep(time.Millisecond)
continue
}
logrus.WithFields(logrus.Fields{"start": offset, "end": newOffset}).Info("writing")
bytes := memoryObject.Buffer.Bytes()[offset:newOffset]
written, err := w.Write(bytes)
if err != nil {
logrus.WithError(err).Info("write failed")
return err
}
logrus.WithFields(logrus.Fields{"n": written}).Info("written")
offset += written
}
@ -213,11 +209,10 @@ const (
func (server *Server) checkLocal(w http.ResponseWriter, _ *http.Request, key string) (exists localStatus, mtime time.Time, err error) {
if stat, err := os.Stat(key); err == nil {
logrus.Println(stat.ModTime(), stat.ModTime().Add(server.Cache.Timeout), time.Now())
if mtime := stat.ModTime(); mtime.Add(server.Cache.Timeout).Before(time.Now()) {
return localExistsButNeedHead, mtime.In(time.UTC), nil
}
return localExists, zeroTime, nil
return localExists, mtime.In(time.UTC), nil
} else if os.IsPermission(err) {
http.Error(w, err.Error(), http.StatusForbidden)
} else if !os.IsNotExist(err) {
@ -255,7 +250,7 @@ func (server *Server) streamOnline(w http.ResponseWriter, r *http.Request, mtime
}
if err := memoryObject.StreamTo(w, memoryObject.wg); err != nil {
logrus.WithError(err).Warn("failed to stream response")
logrus.WithError(err).Warn("failed to stream response with existing memory object")
}
}
} else {
@ -317,8 +312,10 @@ func (server *Server) streamOnline(w http.ResponseWriter, r *http.Request, mtime
go memoryObject.StreamTo(w, memoryObject.wg)
}
err = nil
for chunk := range chunks {
if chunk.error != nil {
err = chunk.error
logrus.WithError(err).Warn("failed to read from upstream")
}
if chunk.buffer == nil {
@ -332,6 +329,11 @@ func (server *Server) streamOnline(w http.ResponseWriter, r *http.Request, mtime
memoryObject.wg.Wait()
if err != nil {
logrus.WithError(err).WithField("upstreamIdx", selectedIdx).Error("something happened during download. will not cache this response")
return
}
go func() {
logrus.Trace("preparing to release memory object")
mtime := zeroTime
@ -408,7 +410,9 @@ func (server *Server) fastesUpstream(r *http.Request, lastModified time.Time) (r
}
if err != nil {
logger.WithError(err).Warn("upstream has error")
if err != context.Canceled && err != context.DeadlineExceeded {
logger.WithError(err).Warn("upstream has error")
}
return
}
if response == nil {
@ -424,12 +428,12 @@ func (server *Server) fastesUpstream(r *http.Request, lastModified time.Time) (r
resultResponse, resultCh, resultErr = response, ch, err
selectedCh <- idx
for idx, cancel := range cancelFuncs {
if resultIdx == idx {
logrus.WithField("upstreamIdx", idx).Trace("selected thus not canceled")
for cancelIdx, cancel := range cancelFuncs {
if cancelIdx == idx {
logrus.WithField("upstreamIdx", cancelIdx).Trace("selected thus not canceled")
continue
}
logrus.WithField("upstreamIdx", idx).Trace("not selected and thus canceled")
logrus.WithField("upstreamIdx", cancelIdx).Trace("not selected and thus canceled")
cancel()
}