graph/db/models: fix race conditions in ChannelEdgeInfo
Both NodeKey1 and NodeKey2 methods had the same race condition as the Node.PubKey method, where concurrent calls could race to write to the cached fields. Remove the caching for the same reasons: parsing overhead is minimal and doesn't justify the complexity and race risk.
This commit is contained in:
1 file changed
+2
-30
@@ -30,11 +30,9 @@ type ChannelEdgeInfo struct {
|
||||
|
||||
// NodeKey1Bytes is the raw public key of the first node.
|
||||
NodeKey1Bytes [33]byte
|
||||
nodeKey1 *btcec.PublicKey
|
||||
|
||||
// NodeKey2Bytes is the raw public key of the first node.
|
||||
NodeKey2Bytes [33]byte
|
||||
nodeKey2 *btcec.PublicKey
|
||||
|
||||
// BitcoinKey1Bytes is the raw public key of the first node.
|
||||
BitcoinKey1Bytes [33]byte
|
||||
@@ -78,42 +76,16 @@ type ChannelEdgeInfo struct {
|
||||
// the creation of this channel. A node is considered "first" if the
|
||||
// lexicographical ordering the its serialized public key is "smaller" than
|
||||
// that of the other node involved in channel creation.
|
||||
//
|
||||
// NOTE: By having this method to access an attribute, we ensure we only need
|
||||
// to fully deserialize the pubkey if absolutely necessary.
|
||||
func (c *ChannelEdgeInfo) NodeKey1() (*btcec.PublicKey, error) {
|
||||
if c.nodeKey1 != nil {
|
||||
return c.nodeKey1, nil
|
||||
}
|
||||
|
||||
key, err := btcec.ParsePubKey(c.NodeKey1Bytes[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.nodeKey1 = key
|
||||
|
||||
return key, nil
|
||||
return btcec.ParsePubKey(c.NodeKey1Bytes[:])
|
||||
}
|
||||
|
||||
// NodeKey2 is the identity public key of the "second" node that was involved in
|
||||
// the creation of this channel. A node is considered "second" if the
|
||||
// lexicographical ordering the its serialized public key is "larger" than that
|
||||
// of the other node involved in channel creation.
|
||||
//
|
||||
// NOTE: By having this method to access an attribute, we ensure we only need
|
||||
// to fully deserialize the pubkey if absolutely necessary.
|
||||
func (c *ChannelEdgeInfo) NodeKey2() (*btcec.PublicKey, error) {
|
||||
if c.nodeKey2 != nil {
|
||||
return c.nodeKey2, nil
|
||||
}
|
||||
|
||||
key, err := btcec.ParsePubKey(c.NodeKey2Bytes[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.nodeKey2 = key
|
||||
|
||||
return key, nil
|
||||
return btcec.ParsePubKey(c.NodeKey2Bytes[:])
|
||||
}
|
||||
|
||||
// OtherNodeKeyBytes returns the node key bytes of the other end of the channel.
|
||||
|
||||
Reference in new issue
Block a user