浏览代码

Routing: Add mutex for `Attributes` temporarily (#3908)

https://github.com/XTLS/Xray-core/pull/3908#issuecomment-2412859858
风扇滑翔翼 1 年之前
父节点
当前提交
86257531ee
共有 1 个文件被更改,包括 20 次插入1 次删除
  1. 20 1
      common/session/session.go

+ 20 - 1
common/session/session.go

@@ -4,6 +4,7 @@ package session // import "github.com/xtls/xray-core/common/session"
 import (
 	"context"
 	"math/rand"
+	"sync"
 
 	c "github.com/xtls/xray-core/common/ctx"
 	"github.com/xtls/xray-core/common/errors"
@@ -65,7 +66,7 @@ type Outbound struct {
 	Tag string
 	// Name of the outbound proxy that handles the connection.
 	Name string
-	// Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings 
+	// Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings
 	Conn net.Conn
 	// CanSpliceCopy is a property for this connection
 	// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
@@ -91,6 +92,10 @@ type Content struct {
 	Attributes map[string]string
 
 	SkipDNSResolve bool
+
+	mu sync.Mutex
+
+	isLocked bool
 }
 
 // Sockopt is the settings for socket connection.
@@ -99,8 +104,22 @@ type Sockopt struct {
 	Mark int32
 }
 
+// Some how when using mux, there will be a same ctx between different requests
+// This will cause problem as it's designed for single request, like concurrent map writes
+// Add a Mutex as a temp solution
+
 // SetAttribute attaches additional string attributes to content.
 func (c *Content) SetAttribute(name string, value string) {
+	if c.isLocked {
+		errors.LogError(context.Background(), "Multiple goroutines are tring to access one routing content, tring to write ", name, ":", value)
+	}
+	c.mu.Lock()
+	c.isLocked = true
+	defer func() {
+		c.isLocked = false
+		c.mu.Unlock()
+	}()
+
 	if c.Attributes == nil {
 		c.Attributes = make(map[string]string)
 	}