package nodes import ( "fmt" "sync" "time" ) // Ctx 结构体:管理不同节点之间的通信行为 type Ctx struct { mu sync.Mutex Behavior map[string]CallBehavior // (src,target) -> CallBehavior Delay map[string]time.Duration // (src,target) -> 延迟时间 Retries map[string]int // 记录 (src,target) 的重发调用次数 } // NewCtx 创建上下文 func NewCtx() *Ctx { return &Ctx{ Behavior: make(map[string]CallBehavior), Delay: make(map[string]time.Duration), Retries: make(map[string]int), } } // SetBehavior 设置 A->B 的 RPC 行为 func (c *Ctx) SetBehavior(src, dst string, behavior CallBehavior, delay time.Duration, retries int) { c.mu.Lock() defer c.mu.Unlock() key := fmt.Sprintf("%s->%s", src, dst) c.Behavior[key] = behavior c.Delay[key] = delay c.Retries[key] = retries } // GetBehavior 获取 A->B 的行为 func (c *Ctx) GetBehavior(src, dst string) (CallBehavior) { c.mu.Lock() defer c.mu.Unlock() key := fmt.Sprintf("%s->%s", src, dst) if state, exists := c.Behavior[key]; exists { return state } return NormalRpc } func (c *Ctx) GetDelay(src, dst string) (t time.Duration, ok bool) { c.mu.Lock() defer c.mu.Unlock() key := fmt.Sprintf("%s->%s", src, dst) if t, ok = c.Delay[key]; ok { return t, ok } return 0, ok } func (c *Ctx) GetRetries(src, dst string) (times int, ok bool) { c.mu.Lock() defer c.mu.Unlock() key := fmt.Sprintf("%s->%s", src, dst) if times, ok = c.Retries[key]; ok { return times, ok } return 0, ok }