1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-09-19 18:36:10 -04:00

fix: use sync.Map in request to packet conn server

This commit is contained in:
Shelikhoo 2024-08-24 15:25:12 +01:00 committed by Xiaokang Wang (Shelikhoo)
parent ae4b7733ee
commit 3e7dc35562

View File

@ -5,6 +5,7 @@ import (
"context" "context"
"crypto/rand" "crypto/rand"
"io" "io"
"sync"
"time" "time"
"github.com/golang-collections/go-datastructures/queue" "github.com/golang-collections/go-datastructures/queue"
@ -176,7 +177,7 @@ func (r *requestToPacketConnClientSession) Close() error {
func newRequestToPacketConnServer(ctx context.Context, config *ServerConfig) *requestToPacketConnServer { func newRequestToPacketConnServer(ctx context.Context, config *ServerConfig) *requestToPacketConnServer {
return &requestToPacketConnServer{ return &requestToPacketConnServer{
sessionMap: make(map[string]*requestToPacketConnServerSession), sessionMap: sync.Map{},
ctx: ctx, ctx: ctx,
config: config, config: config,
} }
@ -185,7 +186,7 @@ func newRequestToPacketConnServer(ctx context.Context, config *ServerConfig) *re
type requestToPacketConnServer struct { type requestToPacketConnServer struct {
packetSessionReceiver request.SessionReceiver packetSessionReceiver request.SessionReceiver
sessionMap map[string]*requestToPacketConnServerSession sessionMap sync.Map
ctx context.Context ctx context.Context
config *ServerConfig config *ServerConfig
@ -203,7 +204,15 @@ func (r *requestToPacketConnServer) OnRoundTrip(ctx context.Context, req request
return request.Response{}, newError("nil session id") return request.Response{}, newError("nil session id")
} }
sessionID := string(SessionID) sessionID := string(SessionID)
session, found := r.sessionMap[sessionID] var session *requestToPacketConnServerSession
sessionAny, found := r.sessionMap.Load(sessionID)
if found {
var ok bool
session, ok = sessionAny.(*requestToPacketConnServerSession)
if !ok {
return request.Response{}, newError("failed to cast session")
}
}
if !found { if !found {
ctxWithFinish, finish := context.WithCancel(ctx) ctxWithFinish, finish := context.WithCancel(ctx)
session = &requestToPacketConnServerSession{ session = &requestToPacketConnServerSession{
@ -218,9 +227,11 @@ func (r *requestToPacketConnServer) OnRoundTrip(ctx context.Context, req request
maxWriteDuration: int(r.config.MaxWriteDurationMs), maxWriteDuration: int(r.config.MaxWriteDurationMs),
maxSimultaneousWriteConnection: int(r.config.MaxSimultaneousWriteConnection), maxSimultaneousWriteConnection: int(r.config.MaxSimultaneousWriteConnection),
} }
r.sessionMap[sessionID] = session _, loaded := r.sessionMap.LoadOrStore(sessionID, session)
if !loaded {
err = r.packetSessionReceiver.OnNewSession(ctx, session) err = r.packetSessionReceiver.OnNewSession(ctx, session)
} }
}
if err != nil { if err != nil {
return request.Response{}, err return request.Response{}, err
} }
@ -228,7 +239,7 @@ func (r *requestToPacketConnServer) OnRoundTrip(ctx context.Context, req request
} }
func (r *requestToPacketConnServer) removeSessionID(sessionID []byte) { func (r *requestToPacketConnServer) removeSessionID(sessionID []byte) {
delete(r.sessionMap, string(sessionID)) r.sessionMap.Delete(string(sessionID))
} }
type requestToPacketConnServerSession struct { type requestToPacketConnServerSession struct {