diff --git a/lnrpc/wtclientrpc/wtclient.go b/lnrpc/wtclientrpc/wtclient.go index 9ba6fce6c..9ee94977b 100644 --- a/lnrpc/wtclientrpc/wtclient.go +++ b/lnrpc/wtclientrpc/wtclient.go @@ -324,40 +324,42 @@ func (c *WatchtowerClient) GetTowerInfo(ctx context.Context, req.IncludeSessions, req.ExcludeExhaustedSessions, ) - // Get the tower and its sessions from anchors client. - tower, err := c.cfg.AnchorClient.LookupTower(pubKey, opts...) - if err != nil { - return nil, err - } - rpcTower := marshallTower( - tower, PolicyType_ANCHOR, req.IncludeSessions, ackCounts, - committedUpdateCounts, - ) - - // Get the tower and its sessions from legacy client. - tower, err = c.cfg.Client.LookupTower(pubKey, opts...) + towersPerBlobType, err := c.cfg.ClientMgr.LookupTower(pubKey, opts...) if err != nil { return nil, err } - rpcLegacyTower := marshallTower( - tower, PolicyType_LEGACY, req.IncludeSessions, ackCounts, - committedUpdateCounts, - ) + var resTower *Tower + for blobType, tower := range towersPerBlobType { + policyType := PolicyType_LEGACY + if blobType.IsAnchorChannel() { + policyType = PolicyType_ANCHOR + } - if !bytes.Equal(rpcTower.Pubkey, rpcLegacyTower.Pubkey) { - return nil, fmt.Errorf("legacy and anchor clients returned " + - "inconsistent results for the given tower") + rpcTower := marshallTower( + tower, policyType, req.IncludeSessions, + ackCounts, committedUpdateCounts, + ) + + if resTower == nil { + resTower = rpcTower + continue + } + + if !bytes.Equal(rpcTower.Pubkey, resTower.Pubkey) { + return nil, fmt.Errorf("tower clients returned " + + "inconsistent results for the given tower") + } + + resTower.SessionInfo = append( + resTower.SessionInfo, rpcTower.SessionInfo..., + ) + resTower.Sessions = append( + resTower.Sessions, rpcTower.Sessions..., + ) } - rpcTower.SessionInfo = append( - rpcTower.SessionInfo, rpcLegacyTower.SessionInfo..., - ) - rpcTower.Sessions = append( - rpcTower.Sessions, rpcLegacyTower.Sessions..., - ) - - return rpcTower, nil + return resTower, nil } // constructFunctionalOptions is a helper function that constructs a list of diff --git a/watchtower/wtclient/client.go b/watchtower/wtclient/client.go index e9b1c6dff..d68be1afd 100644 --- a/watchtower/wtclient/client.go +++ b/watchtower/wtclient/client.go @@ -95,10 +95,6 @@ type RegisteredTower struct { // Client is the primary interface used by the daemon to control a client's // lifecycle and backup revoked states. type Client interface { - // LookupTower retrieves a registered watchtower through its public key. - LookupTower(*btcec.PublicKey, - ...wtdb.ClientSessionListOption) (*RegisteredTower, error) - // Policy returns the active client policy configuration. Policy() wtpolicy.Policy @@ -1600,15 +1596,11 @@ func (c *TowerClient) registeredTowers(towers []*wtdb.Tower, return registeredTowers, nil } -// LookupTower retrieves a registered watchtower through its public key. -func (c *TowerClient) LookupTower(pubKey *btcec.PublicKey, +// lookupTower retrieves the info of sessions held with the given tower handled +// by this client. +func (c *TowerClient) lookupTower(tower *wtdb.Tower, opts ...wtdb.ClientSessionListOption) (*RegisteredTower, error) { - tower, err := c.cfg.DB.LoadTower(pubKey) - if err != nil { - return nil, err - } - opts = append(opts, wtdb.WithPreEvalFilterFn(c.genSessionFilter(false))) towerSessions, err := c.cfg.DB.ListClientSessions(&tower.ID, opts...) diff --git a/watchtower/wtclient/manager.go b/watchtower/wtclient/manager.go index c0d501e6f..ba2cdb27d 100644 --- a/watchtower/wtclient/manager.go +++ b/watchtower/wtclient/manager.go @@ -43,6 +43,10 @@ type TowerClientManager interface { // type. RegisteredTowers(opts ...wtdb.ClientSessionListOption) ( map[blob.Type][]*RegisteredTower, error) + + // LookupTower retrieves a registered watchtower through its public key. + LookupTower(*btcec.PublicKey, ...wtdb.ClientSessionListOption) ( + map[blob.Type]*RegisteredTower, error) } // Config provides the TowerClient with access to the resources it requires to @@ -354,3 +358,29 @@ func (m *Manager) RegisteredTowers(opts ...wtdb.ClientSessionListOption) ( return resp, nil } + +// LookupTower retrieves a registered watchtower through its public key. +func (m *Manager) LookupTower(key *btcec.PublicKey, + opts ...wtdb.ClientSessionListOption) (map[blob.Type]*RegisteredTower, + error) { + + tower, err := m.cfg.DB.LoadTower(key) + if err != nil { + return nil, err + } + + m.clientsMu.Lock() + defer m.clientsMu.Unlock() + + resp := make(map[blob.Type]*RegisteredTower) + for _, client := range m.clients { + tower, err := client.lookupTower(tower, opts...) + if err != nil { + return nil, err + } + + resp[client.Policy().BlobType] = tower + } + + return resp, nil +}