李度、马也驰 25spring数据库系统 p1仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.5 KiB

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
}