func (self *RedisCluster) disconnectAll() {
	if self.Debug {
		log.Info("[RedisCluster] PID:", os.Getpid(), " [Disconnect!] Had Handles:", self.Handles.Count())
	}
	// disconnect anyone in handles
	// for _, handle := range self.Handles {
	for item := range self.Handles.Iter() {
		item.Val.(*RedisHandle).Pool.Close()
	}
	// nuke handles
	//for addr, _ := range self.SeedHosts {
	for item := range self.SeedHosts.Iter() {
		// delete(self.Handles, item.Key)
		self.Handles.Remove(item.Key)
	}
	// nuke slots
	self.Slots = iMap.New()
}
func NewRedisCluster(seed_redii []map[string]string, poolConfig PoolConfig, debug bool) RedisCluster {
	cluster := RedisCluster{
		RefreshTableASAP: false,
		SingleRedisMode:  !poolConfig.IsCluster,
		SeedHosts:        cmap.New(), //make(map[string]bool),
		Handles:          cmap.New(), //make(map[string]*RedisHandle),
		Slots:            iMap.New(), // make(map[uint16]string),
		poolConfig:       poolConfig,
		Debug:            debug,
	}

	if cluster.Debug {
		log.Debug("[RedisCluster], PID", os.Getpid(), "StartingNewRedisCluster")
	}

	for _, redis := range seed_redii {
		for host, port := range redis {
			label := host + ":" + port
			cluster.SeedHosts.Set(label, true)
			cluster.Handles.Set(label, NewRedisHandle(host, port, poolConfig, debug))
		}
	}

	//for addr, _ := range cluster.SeedHosts {
	for item := range cluster.SeedHosts.Iter() {
		node := cluster.addRedisHandleIfNeeded(item.Key)
		cluster_enabled := cluster.hasClusterEnabled(node)
		if cluster_enabled == false {
			if cluster.SeedHosts.Count() == 1 {
				cluster.SingleRedisMode = true
			} else {
				log.Fatal(errors.New("Multiple Seed Hosts Given, But Cluster Support Disabled in Redis"))
			}
		}
	}

	if cluster.SingleRedisMode == false {
		cluster.populateSlotsCache()
	}
	return cluster
}