示例#1
0
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	//will fix registering and race conditions after checkpoint
	node := args.ServerInfo
	nodeID := int(node.NodeID)

	_, in := ss.registerMap[nodeID]

	if !in {
		ss.ring = append(ss.ring, node)
		ss.registerMapLock.Lock()
		ss.registerMap[nodeID] = &node
		ss.registerMapLock.Unlock()
	}

	if len(ss.registerMap)+1 != ss.numNodes {
		reply.Status = storagerpc.NotReady
		reply.Servers = nil
	} else {
		reply.Status = storagerpc.OK
		reply.Servers = ss.ring
		_, in := ss.okdMap[nodeID]
		if !in {
			ss.okdMap[nodeID] = 0
		}
	}

	if len(ss.okdMap)+1 == ss.numNodes {
		ss.nodeCount = ss.numNodes
		ss.allConnected <- 1
	}

	return nil
}
示例#2
0
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {

	serverID := args.ServerInfo.NodeID
	seen := false

	for i := 0; i < ss.count; i++ {
		if ss.servers[i].NodeID == serverID {
			seen = true
		}
	}

	// Add this server to the list
	if seen == false {
		ss.countLock.Lock()
		ss.servers[ss.count] = args.ServerInfo
		ss.count++
		ss.countLock.Unlock()
	}
	// If all servers have connected, send the OK and reply with server list
	if ss.count == len(ss.servers) {
		reply.Status = storagerpc.OK
		reply.Servers = ss.servers
	} else {
		reply.Status = storagerpc.NotReady
		reply.Servers = nil
	}
	return nil
}
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	if !ss.isMaster {
		return errors.New("I am not a master!")
	}
	ss.registerLocker.Lock()
	defer ss.registerLocker.Unlock()
	/* Check if the node has already registered. */
	hasRegistered := false
	for _, node := range ss.nodes {
		if args.ServerInfo.NodeID == node.NodeID {
			hasRegistered = true
		}
	}
	/* Register new node */
	if !hasRegistered {
		fmt.Printf("Register node %d, NodeID is %d\n", ss.registerCnt, args.ServerInfo.NodeID)
		ss.nodes[ss.registerCnt] = args.ServerInfo
		ss.registerCnt += 1
	}
	/* If all nodes has registered, return OK */
	if ss.registerCnt == ss.numNodes {
		sort.Sort(SortNodeByNodeID(ss.nodes))
		reply.Status = storagerpc.OK
		reply.Servers = ss.nodes
	} else {
		reply.Status = storagerpc.NotReady
	}
	return nil
}
// RegisterServer adds a storage server to the ring. It replies with
// status NotReady if not all nodes in the ring have joined. Once
// all nodes have joined, it should reply with status OK and a list
// of all connected nodes in the ring.
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {

	ss.rMutex.Lock()
	defer ss.rMutex.Unlock()

	// check if this server has already joined
	_, ok := ss.ringSet[args.ServerInfo]
	if !ok {
		fmt.Println("MasterSide: Register a new Slave Storage Server.", args.ServerInfo)
		ss.ring = append(ss.ring, args.ServerInfo)
		ss.ringSet[args.ServerInfo] = 1
	} else {
		//		fmt.Println("MasterSide: Ignore one slave storage server.", args.ServerInfo);
	}

	if len(ss.ring) == ss.totalNode {
		// if the connection is finished
		reply.Servers = ss.ring
		reply.Status = storagerpc.OK
		//ss.iCond.Signal()
		if !ok {
			ss.masterReady <- 1
		}
		fmt.Println("****Register Function: all node registered.")
	} else {
		reply.Status = storagerpc.NotReady
		//		fmt.Println("Registration not ready:", len(ss.ring), ss.totalNode)
	}

	return nil
}
示例#5
0
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	ss.serverMutex.Lock()
	defer ss.serverMutex.Unlock()
	if ss.isMaster == true {
		serverInfo := args.ServerInfo
		exist := ss.serverExist(serverInfo)
		if exist == false {
			ss.serverList.PushBack(serverInfo)
		}
		if ss.serverList.Len() < ss.numNodes {
			reply.Status = storagerpc.NotReady
			reply.Servers = nil
		} else if ss.serverList.Len() == ss.numNodes {
			reply.Status = storagerpc.OK
			reply.Servers = list2SliceNode(ss.serverList)
			sort.Sort(serverList(reply.Servers))
			ss.serverList.Init()
			// ss.serverList = *list.New()
			for i := 0; i < len(reply.Servers); i++ {
				ss.serverList.PushBack(reply.Servers[i])
			}
			reply.Servers = list2SliceNode(ss.serverList)
			if exist == false {
				ss.isReady = true
				ss.storageServerReady <- 1
			}
		} else {
			return errors.New("Error registered server number overflow")
		}
	} else {
		fmt.Println("Fatal Error")
		return errors.New("Error register with slave server")
	}
	return nil
}
示例#6
0
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	if !ss.isMaster {
		return errors.New("server is not a master")
	}

	ss.infoRWL.Lock()
	defer ss.infoRWL.Unlock()

	if ss.isReady {
		reply.Status = storagerpc.OK
	} else {
		reply.Status = storagerpc.NotReady

		// add to cluster
		if _, exisit := ss.servers[args.ServerInfo.NodeID]; !exisit {
			ss.servers[args.ServerInfo.NodeID] = &args.ServerInfo
		}
		if len(ss.servers) == ss.numNodes {
			ss.isReady = true
			reply.Status = storagerpc.OK
			close(ss.readyChan)
		}
	}

	for k := range ss.servers {
		reply.Servers = append(reply.Servers, *ss.servers[k])
	}

	return nil
}
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	ss.dataLock.Lock()
	defer ss.dataLock.Unlock()
	node := args.ServerInfo
	_, ok := ss.seenNodes[node.NodeID]
	if !ok {
		ss.seenNodes[node.NodeID] = true
		ss.servers[ss.nextNode] = node
		ss.nextNode++
	}
	if ss.nextNode == ss.numNodes {
		reply.Status = storagerpc.OK
		reply.Servers = ss.servers
		if !ss.allServersReadyBool {
			ss.allServersReady <- 1
		}
	} else {
		reply.Status = storagerpc.NotReady
		reply.Servers = nil
	}
	return nil
}
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	serverInfo := args.ServerInfo
	_, ok := ss.nodeIdMap[serverInfo.NodeID]
	if !ok {
		ss.nodeIdMap[serverInfo.NodeID] = args.ServerInfo
		ss.nodesList = append(ss.nodesList, args.ServerInfo)
	}

	if len(ss.nodeIdMap) < ss.nodeSize {
		reply.Status = storagerpc.NotReady
	} else {
		reply.Status = storagerpc.OK
		reply.Servers = ss.nodesList
		ss.cMutex.Lock()
		ss.informedCount += 1
		ss.cMutex.Unlock()
		if ss.informedCount == ss.nodeSize-1 {
			ss.serverFull <- 1
		}
	}
	return nil
}
示例#9
0
func (ss *storageServer) RegisterServer(args *storagerpc.RegisterArgs, reply *storagerpc.RegisterReply) error {
	//Add to node map if it's a new slave
	_, exist := ss.nodeMap[args.ServerInfo.NodeID]
	if !exist {
		ss.nodeMap[args.ServerInfo.NodeID] = args.ServerInfo
	}

	//RPC reply
	if len(ss.nodeMap) < ss.numNodes {
		reply.Status = storagerpc.NotReady
	} else {
		i := 0
		for _, node := range ss.nodeMap {
			ss.nodeList[i] = node
			i = i + 1
		}

		reply.Status = storagerpc.OK
		reply.Servers = ss.nodeList
	}

	return nil
}