stdLog "log"
"net/http"
"os"
- "time"
"github.com/anacrolix/bargle"
"github.com/anacrolix/envpprof"
app "github.com/anacrolix/gostdapp"
- "github.com/anacrolix/log"
xprometheus "github.com/anacrolix/missinggo/v2/prometheus"
+ "github.com/anacrolix/torrent/bencode"
+ "github.com/anacrolix/torrent/version"
"github.com/davecgh/go-spew/spew"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
- "go.opentelemetry.io/otel/sdk/trace"
-
- "github.com/anacrolix/torrent/bencode"
- "github.com/anacrolix/torrent/version"
)
func init() {
http.Handle("/metrics", promhttp.Handler())
}
-func shutdownTracerProvider(ctx context.Context, tp *trace.TracerProvider) {
- started := time.Now()
- err := tp.Shutdown(ctx)
- elapsed := time.Since(started)
- logger := log.Default.Slogger()
- logger.Debug("shutting down tracer provider", "took", elapsed)
- if err != nil && ctx.Err() == nil {
- log.Default.Slogger().Error("error shutting down tracer provider", "err", err)
- }
-}
-
func main() {
app.RunContext(mainErr)
}
+++ /dev/null
-package torrent
-
-import (
- "fmt"
- "strings"
-)
-
-func formatMap[K comparable, V any](m map[K]V) string {
- var sb strings.Builder
- for k, v := range m {
- fmt.Fprintf(&sb, "%v: %v\n", k, v)
- }
- return strings.TrimSuffix(sb.String(), "\n")
-}
RequestIndex uint32
ChunkIndex = RequestIndex
Request = types.Request
- pieceIndex = types.PieceIndex
piecePriority = types.PiecePriority
// This can be made into a type-param later, will be great for testing.
ChunkSpec = types.ChunkSpec
return
}
}
- return
-
}
}
panicif.False(c.peerRequestServerRunning)
c.peerRequestServerRunning = false
c.locker().Unlock()
- return
}
// TODO: Return an error then let caller filter on conditions.
//b.StopTimer()
b.ResetTimer()
//b.ReportAllocs()
- for _ = range iter.N(b.N) {
+ for range b.N {
storageClient.completed = 0
for pieceIndex := range iter.N(numPieces) {
tor.updatePieceCompletion(pieceIndex)
"os"
g "github.com/anacrolix/generics"
- "github.com/anacrolix/missinggo/v2"
-
"github.com/anacrolix/torrent/metainfo"
)
if off+int64(len(b)) > p.mip.Length() {
panic("write overflows piece")
}
- b = missinggo.LimitLen(b, p.mip.Length()-off)
return p.PieceImpl.WriteAt(b, off)
}
err = io.EOF
return
}
- b = missinggo.LimitLen(b, p.mip.Length()-off)
+ b = b[:min(int64(len(b)), p.mip.Length()-off)]
if len(b) == 0 {
return
}
index++
w.Write([]byte("OK"))
- return
})
if err := http.ListenAndServe(":8080", mux); err != nil {
}
}
-func (t *Torrent) requestIndexIsInActiveWebseedRequest(reqIndex RequestIndex) bool {
- for _, p := range t.webSeeds {
- for range p.activeRequestsForIndex(reqIndex) {
- return true
- }
- }
- return false
-}
-
func (t *Torrent) hasActiveWebseedRequests() bool {
for _, p := range t.webSeeds {
for req := range p.activeRequests {
"errors"
"fmt"
"io"
- "iter"
"log/slog"
"math/rand"
"strings"
return true, nil
}
-func (me *webseedPeer) numRequests() int {
- // What about unassigned requests? TODO: Don't allow those.
- return len(me.activeRequests)
-}
-
func (me *webseedPeer) lastWriteUploadRate() float64 {
// We never upload to webseeds.
return 0
// Webseeds check the next request is wanted before reading it.
func (ws *webseedPeer) handleCancel(RequestIndex) {}
-func (ws *webseedPeer) activeRequestsForIndex(r RequestIndex) iter.Seq[*webseedRequest] {
- return func(yield func(*webseedRequest) bool) {
- for wr := range ws.activeRequests {
- if r >= wr.next && r < wr.end {
- if !yield(wr) {
- return
- }
- }
- }
- }
-}
-
func (ws *webseedPeer) requestIndexTorrentOffset(r RequestIndex) int64 {
return ws.peer.t.requestIndexBegin(r)
}
ws.peer.updateExpectingChunks()
}
-func (ws *webseedPeer) inactiveRequestIndex(index RequestIndex) bool {
- for range ws.activeRequestsForIndex(index) {
- return false
- }
- return true
-}
-
func (ws *webseedPeer) connectionFlags() string {
return "WS"
}