func (self *Inspector) IsClusterDamaged(cluster *topo.Cluster, seeds []*topo.Node) bool { // more than half masters dead numFail := 0 for _, node := range cluster.MasterNodes() { if node.Fail { numFail++ } } if numFail >= (cluster.Size()+1)/2 { return true } // more than half nodes dead if len(seeds) > cluster.NumLocalRegionNode()/2 { return false } for _, seed := range seeds { c, err := self.initClusterTopo(seed) if err != nil { return false } for _, node := range c.LocalRegionNodes() { // nodes not in seeds must be pfail if !containsNode(node, seeds) && !node.PFail { return false } } } glog.Info("more than half nodes dead") return true }