Now using a map of ClientId to clientConnection which is more efficient for deleting clients.

This commit is contained in:
Erik Brakkee 2024-08-15 22:16:20 +02:00
parent cdfe7c2a47
commit deba6c7e91

View File

@ -21,10 +21,9 @@ type agentConnection struct {
CommChannel comms.CommChannel
}
var agentIdGenerator = concurrency.NewAtomicCounter()
var clientIdGenerator = concurrency.NewAtomicCounter()
type ClientConnection struct {
type clientConnection struct {
Info *models.Client
agentConnection net.Conn
clientConnection iowrappers2.ReadWriteAddrCloser
@ -45,7 +44,7 @@ func newAgent(commChannel comms.CommChannel, publicId models.RendezVousId, agent
}
func newClient(publicId models.RendezVousId, clientConn iowrappers2.ReadWriteAddrCloser,
agentConn net.Conn, agentGuid models.AgentGuid) *ClientConnection {
agentConn net.Conn, agentGuid models.AgentGuid) *clientConnection {
client := models.Client{
Guid: models.ClientGuid(strconv.Itoa(rand.Int())),
RemoteAddr: models.RemoteAddr(clientConn.RemoteAddr().String()),
@ -54,14 +53,14 @@ func newClient(publicId models.RendezVousId, clientConn iowrappers2.ReadWriteAdd
ClientId: models.ClientId(strconv.Itoa(clientIdGenerator.IncrementAndGet())),
StartTime: time.Now(),
}
return &ClientConnection{
return &clientConnection{
Info: &client,
agentConnection: agentConn,
clientConnection: clientConn,
}
}
func (match *ClientConnection) Synchronize() {
func (match *clientConnection) Synchronize() {
iowrappers2.SynchronizeStreams("client -- agent", match.clientConnection, match.agentConnection)
}
@ -75,7 +74,7 @@ type Admin struct {
// TODO: use linked map for both of these
agents map[models.RendezVousId]*agentConnection
clients []*ClientConnection
clients map[models.ClientId]*clientConnection
}
func NewAdmin() *Admin {
@ -83,7 +82,7 @@ func NewAdmin() *Admin {
mutex: sync.Mutex{},
state: models.NewState(),
agents: make(map[models.RendezVousId]*agentConnection),
clients: make([]*ClientConnection, 0), // not strictly needed
clients: make(map[models.ClientId]*clientConnection),
}
}
@ -146,7 +145,7 @@ func (admin *Admin) AddAgent(publicId models.RendezVousId, agentInfo comms.Envir
return agent, nil
}
func (admin *Admin) AddClient(publicId models.RendezVousId, clientConn iowrappers2.ReadWriteAddrCloser) (*ClientConnection, error) {
func (admin *Admin) AddClient(publicId models.RendezVousId, clientConn iowrappers2.ReadWriteAddrCloser) (*clientConnection, error) {
admin.mutex.Lock()
defer admin.mutex.Unlock()
@ -177,7 +176,7 @@ func (admin *Admin) AddClient(publicId models.RendezVousId, clientConn iowrapper
admin.state = admin.state.Copy()
admin.state.Clients.Put(client.Info.Guid, client.Info)
admin.clients = append(admin.clients, client)
admin.clients[client.Info.ClientId] = client
return client, nil
}
@ -212,7 +211,7 @@ func (admin *Admin) RemoveAgent(publicId models.RendezVousId) error {
return nil
}
func (admin *Admin) RemoveClient(client *ClientConnection) error {
func (admin *Admin) RemoveClient(client *clientConnection) error {
admin.mutex.Lock()
defer admin.mutex.Unlock()
@ -222,14 +221,9 @@ func (admin *Admin) RemoveClient(client *ClientConnection) error {
_ = client.agentConnection.Close()
_ = client.clientConnection.Close()
for i, _client := range admin.clients {
if _client.Info.ClientId == client.Info.ClientId {
admin.state = admin.state.Copy()
admin.state.Clients.Delete(client.Info.Guid)
admin.clients = append(admin.clients[:i], admin.clients[i+1:]...)
break
}
}
admin.state = admin.state.Copy()
admin.state.Clients.Delete(client.Info.Guid)
delete(admin.clients, client.Info.ClientId)
return nil
}