func (cs *ClusterService) loadCluster() { cs.clusterMutex.Lock() // Load data log.Debug("cls: Loading cluster data...") stat, err := os.Stat(cs.clsDataPath) if err == nil && stat.IsRegular() { file, err := os.Open(cs.clsDataPath) if err == nil { typedFile := typedio.NewReader(file) cs.clusterVersion, _ = typedFile.ReadInt64() // cluster version cs.diskVerson = cs.clusterVersion nbNodes, _ := typedFile.ReadUint16() // nodes count var i uint16 for i = 0; i < nbNodes; i++ { node := cluster.NewEmptyNode() node.Unserialize(typedFile) node.Status = cluster.Status_Offline cs.cluster.MergeNode(node, false) // merge node, doesn't notify } } else { log.Error("cls: Error while opening data file", err) } } // replay commit log log.Info("cls: Replaying commit log...") cs.commitlog.Replay() // TODO: Load cluster data cs.clusterMutex.Unlock() }
func (r *Message) readMessage(reader io.Reader) (err os.Error) { treader := typedio.NewReader(reader) r.Id, err = treader.ReadUint16() // message id if err != nil { return } flags, err := treader.ReadUint8() // flags if err != nil { return } hasInitId := false if flags&prm_has_init_msg_id == prm_has_init_msg_id { hasInitId = true } if flags&prm_is_data == prm_is_data { r.Type = T_DATA } else { r.Type = T_MSG } if flags&prm_src_node_adhoc == prm_src_node_adhoc { r.srcNodeAdhoc = true } if flags&prm_has_middle_node == prm_has_middle_node { r.middleNodePresent = true } if flags&prm_middle_node_adhoc == prm_middle_node_adhoc { r.middleNodeAdhoc = true } if hasInitId { r.InitId, err = treader.ReadUint16() // initial message id if err != nil { return } } r.ServiceId, err = treader.ReadUint8() // service id if err != nil { return } msgSize, err := treader.ReadUint16() // message size if err != nil { return } if r.Type == T_DATA { r.DataSize, err = treader.ReadInt64() // data size if err != nil { return } } if r.srcNodeAdhoc { // source node information adr, err := treader.ReadString() // addr if err != nil { return } r.srcNodeAdr = net.ParseIP(adr) r.srcNodeTcpPort, err = treader.ReadUint16() // tcp port if err != nil { return } r.srcNodeUdpPort, err = treader.ReadUint16() // udp port if err != nil { return } } else { r.srcNodeId, err = treader.ReadUint16() // node id if err != nil { return } } // TODO: Adhoc if r.middleNodePresent { if r.middleNodeAdhoc { adr, err := treader.ReadString() // addr if err != nil { return } r.middleNodeAdr = net.ParseIP(adr) r.middleNodeTcpPort, err = treader.ReadUint16() // tcp port if err != nil { return } r.middleNodeUdpPort, err = treader.ReadUint16() // udp port if err != nil { return } } else { r.middleNodeId, err = treader.ReadUint16() // node id if err != nil { return } } } r.FunctionId, err = treader.ReadUint8() // function id if err != nil { return } // Load message r.Message = buffer.NewWithSize(int64(msgSize), false) // message n, err := io.Copyn(r.Message, reader, int64(msgSize)) r.Message.Seek(0, 0) if err != nil { log.Error("COMM: Got an error reading message from message: %s", err) return err } if n != int64(msgSize) { log.Error("COMM: Couldn't read the whole message. Read %d out of %d", n, msgSize) return os.NewError("Message truncated") } // release the connection if its a message if r.Type == T_MSG { r.Release() } else { r.Data = reader } return nil }