示例#1
0
/*
	自己保存这个节点,只能保存超级节点
*/
func (this *NodeManager) saveNode(findNode *FindNode, c engine.Controller) {
	//自己不是超级节点
	if !nodeStore.Root.IsSuper {
		//代理节点查找的备用超级节点
		// if findNode.WantId == "left" || findNode.WantId == "right" {
		// 	fmt.Println("添加备用节点:", nodeStore.ParseId(findNode.FindId))
		// 	// store.AddNode(node)
		// 	// return
		// }
		//查找到的节点和自己的超级节点不一样,则连接新的超级节点
		if nodeStore.SuperName != findNode.FindId {
			oldSuperName := nodeStore.SuperName
			session, _ := c.GetNet().AddClientConn(findNode.Addr, nodeStore.GetRootIdInfoString(), findNode.TcpPort, false)

			nodeStore.SuperName = session.GetName()
			if _, ok := c.GetNet().GetSession(nodeStore.SuperName); ok {
			}
			if session, ok := c.GetNet().GetSession(oldSuperName); ok {
				session.Close()
			}
			return
		}

	}

	findNodeIdInfo := new(nodeStore.IdInfo)
	json.Unmarshal([]byte(findNode.FindId), findNodeIdInfo)
	// nodeStore.Parse(findNode.FindId)
	// shouldNodeInt, _ := new(big.Int).SetString(findNode.FindId, nodeStore.IdStrBit)
	newNode := &nodeStore.Node{
		IdInfo:  *findNodeIdInfo,
		IsSuper: findNode.IsSuper,
		Addr:    findNode.Addr,
		TcpPort: findNode.TcpPort,
		UdpPort: findNode.UdpPort,
	}
	//是否需要这个节点
	if isNeed, replace := nodeStore.CheckNeedNode(findNodeIdInfo.GetId()); isNeed {
		//------------start--------------------------
		//这一块只为打印一个日志,可以去掉
		// ishave := false
		// for _, value := range nodeStore.GetAllNodes() {
		// 	if value.IdInfo.GetId() == findNodeIdInfo.GetId() {
		// 		ishave = true
		// 		break
		// 	}
		// }
		// if ishave {
		// 	fmt.Println("需要这个节点", findNodeIdInfo.GetId())
		// }
		//------------end--------------------------
		nodeStore.AddNode(newNode)
		//把替换的节点连接删除
		if replace != "" {
			//是否要替换超级节点
			if session, ok := c.GetNet().GetSession(nodeStore.SuperName); ok {
				if replace == session.GetName() {
					session.Close()
					session, _ := c.GetNet().AddClientConn(newNode.Addr, nodeStore.GetRootIdInfoString(), newNode.TcpPort, false)
					nodeStore.SuperName = session.GetName()
					introduceSelf(session)
				}
			}
			if session, ok := c.GetSession(replace); ok {
				session.Close()
				nodeStore.DelNode(replace)
			}
		}
		if nodeStore.Root.IsSuper {
			//自己不会连接自己
			if nodeStore.GetRootIdInfoString() == string(newNode.IdInfo.Build()) {
				return
			}
			//检查这个session是否存在
			if _, ok := c.GetNet().GetSession(string(newNode.IdInfo.Build())); !ok {
				session, err := c.GetNet().AddClientConn(newNode.Addr, nodeStore.GetRootIdInfoString(), newNode.TcpPort, false)
				if err != nil {
					fmt.Println(newNode)
					fmt.Println("连接客户端出错")
				} else {
					introduceSelf(session)
				}
			}
		}
	}
}