func NewConnectionManager(rmId common.RMId, bootCount uint32, procs int, db *db.Databases, nodeCertPrivKeyPair *certs.NodeCertificatePrivateKeyPair, port uint16, ss ShutdownSignaller, config *configuration.Configuration) (*ConnectionManager, *TopologyTransmogrifier) { cm := &ConnectionManager{ RMId: rmId, BootCount: bootCount, NodeCertificatePrivateKeyPair: nodeCertPrivKeyPair, servers: make(map[string]*connectionManagerMsgServerEstablished), rmToServer: make(map[common.RMId]*connectionManagerMsgServerEstablished), connCountToClient: make(map[uint32]paxos.ClientConnection), desired: nil, } cm.serverConnSubscribers.subscribers = make(map[paxos.ServerConnectionSubscriber]server.EmptyStruct) cm.serverConnSubscribers.ConnectionManager = cm topSubs := make([]map[eng.TopologySubscriber]server.EmptyStruct, eng.TopologyChangeSubscriberTypeLimit) for idx := range topSubs { topSubs[idx] = make(map[eng.TopologySubscriber]server.EmptyStruct) } topSubs[eng.ConnectionManagerSubscriber][cm] = server.EmptyStructVal cm.topologySubscribers.subscribers = topSubs cm.topologySubscribers.ConnectionManager = cm var head *cc.ChanCellHead head, cm.cellTail = cc.NewChanCellTail( func(n int, cell *cc.ChanCell) { queryChan := make(chan connectionManagerMsg, n) cell.Open = func() { cm.queryChan = queryChan } cell.Close = func() { close(queryChan) } cm.enqueueQueryInner = func(msg connectionManagerMsg, curCell *cc.ChanCell, cont cc.CurCellConsumer) (bool, cc.CurCellConsumer) { if curCell == cell { select { case queryChan <- msg: return true, nil default: return false, nil } } else { return false, cont } } }) cd := &connectionManagerMsgServerEstablished{ send: cm.Send, established: true, rmId: rmId, bootCount: bootCount, } cm.rmToServer[cd.rmId] = cd cm.servers[cd.host] = cd lc := client.NewLocalConnection(rmId, bootCount, cm) cm.Dispatchers = paxos.NewDispatchers(cm, rmId, uint8(procs), db, lc) transmogrifier, localEstablished := NewTopologyTransmogrifier(db, cm, lc, port, ss, config) cm.Transmogrifier = transmogrifier go cm.actorLoop(head) <-localEstablished return cm, transmogrifier }
func NewConnectionManager(rmId common.RMId, bootCount uint32, procs int, disk *mdbs.MDBServer, passwordHash [sha256.Size]byte) (*ConnectionManager, *client.LocalConnection) { cm := &ConnectionManager{ RMId: rmId, BootCount: bootCount, passwordHash: passwordHash, servers: make(map[string]*Connection), rmToServer: make(map[common.RMId]*connectionWithBootCount), connCountToClient: make(map[uint32]paxos.ClientConnection), desired: nil, senders: make(map[paxos.Sender]server.EmptyStruct), } var head *cc.ChanCellHead head, cm.cellTail = cc.NewChanCellTail( func(n int, cell *cc.ChanCell) { queryChan := make(chan connectionManagerMsg, n) cell.Open = func() { cm.queryChan = queryChan } cell.Close = func() { close(queryChan) } cm.enqueueQueryInner = func(msg connectionManagerMsg, curCell *cc.ChanCell, cont cc.CurCellConsumer) (bool, cc.CurCellConsumer) { if curCell == cell { select { case queryChan <- msg: return true, nil default: return false, nil } } else { return false, cont } } }) lc := client.NewLocalConnection(rmId, bootCount, server.BlankTopology, cm) cm.Dispatchers = paxos.NewDispatchers(cm, rmId, uint8(procs), disk, lc) cm.rmToServer[rmId] = &connectionWithBootCount{connectionSend: cm, bootCount: bootCount} go cm.actorLoop(head) cm.ClientEstablished(0, lc) return cm, lc }