multi: add unsafedisconnect as a dev config

This commit adds a new dev config `unsafedisconnect` as we sometimes
want to disconnect nodes in our itests.
This commit is contained in:
yyforyongyu committed 2024-02-01 21:21:18 +08:00
1 parent 9adec89fa8
commit 1057eb729d
4 files changed
+37 -6

No files matched your search

+11
View File
@@ -24,6 +24,17 @@ func (d *DevConfig) ChannelReadyWait() time.Duration {
return 0 return 0
} }
// GetUnsafeDisconnect returns the config value, which is always true for
// production build.
//
// TODO(yy): this is a temporary solution to allow users to reconnect peers to
// trigger a reestablishiment for the active channels. Once a new dedicated RPC
// is added to realize that functionality, this function should return false to
// forbidden disconnecting peers while there are active channels.
func (d *DevConfig) GetUnsafeDisconnect() bool {
return true
}
// GetReservationTimeout returns the config value for `ReservationTimeout`. // GetReservationTimeout returns the config value for `ReservationTimeout`.
func (d *DevConfig) GetReservationTimeout() time.Duration { func (d *DevConfig) GetReservationTimeout() time.Duration {
return DefaultReservationTimeout return DefaultReservationTimeout
+6
View File
@@ -22,6 +22,7 @@ type DevConfig struct {
ProcessChannelReadyWait time.Duration `long:"processchannelreadywait" description:"Time to sleep before processing remote node's channel_ready message."` ProcessChannelReadyWait time.Duration `long:"processchannelreadywait" description:"Time to sleep before processing remote node's channel_ready message."`
ReservationTimeout time.Duration `long:"reservationtimeout" description:"The maximum time we keep a pending channel open flow in memory."` ReservationTimeout time.Duration `long:"reservationtimeout" description:"The maximum time we keep a pending channel open flow in memory."`
ZombieSweeperInterval time.Duration `long:"zombiesweeperinterval" description:"The time interval at which channel opening flows are evaluated for zombie status."` ZombieSweeperInterval time.Duration `long:"zombiesweeperinterval" description:"The time interval at which channel opening flows are evaluated for zombie status."`
UnsafeDisconnect bool `long:"unsafedisconnect" description:"Allows the rpcserver to intentionally disconnect from peers with open channels."`
} }
// ChannelReadyWait returns the config value `ProcessChannelReadyWait`. // ChannelReadyWait returns the config value `ProcessChannelReadyWait`.
@@ -46,3 +47,8 @@ func (d *DevConfig) GetZombieSweeperInterval() time.Duration {
return d.ZombieSweeperInterval return d.ZombieSweeperInterval
} }
// ChannelReadyWait returns the config value `UnsafeDisconnect`.
func (d *DevConfig) GetUnsafeDisconnect() bool {
return d.UnsafeDisconnect
}
+3 -1
View File
@@ -206,7 +206,6 @@ func (cfg *BaseNodeConfig) GenArgs() []string {
args = append(args, backendArgs...) args = append(args, backendArgs...)
nodeArgs := []string{ nodeArgs := []string{
"--bitcoin.active",
"--nobootstrap", "--nobootstrap",
"--debuglevel=debug,DISC=trace", "--debuglevel=debug,DISC=trace",
"--bitcoin.defaultchanconfs=1", "--bitcoin.defaultchanconfs=1",
@@ -241,6 +240,9 @@ func (cfg *BaseNodeConfig) GenArgs() []string {
// Speed up the tests for bitcoind backend. // Speed up the tests for bitcoind backend.
"--bitcoind.blockpollinginterval=100ms", "--bitcoind.blockpollinginterval=100ms",
"--bitcoind.txpollinginterval=100ms", "--bitcoind.txpollinginterval=100ms",
// Allow unsafe disconnect in itest.
"--dev.unsafedisconnect",
} }
args = append(args, nodeArgs...) args = append(args, nodeArgs...)
+17 -5
View File
@@ -1747,15 +1747,27 @@ func (r *rpcServer) DisconnectPeer(ctx context.Context,
// In order to avoid erroneously disconnecting from a peer that we have // In order to avoid erroneously disconnecting from a peer that we have
// an active channel with, if we have any channels active with this // an active channel with, if we have any channels active with this
// peer, then we'll disallow disconnecting from them. // peer, then we'll disallow disconnecting from them.
if len(nodeChannels) > 0 { if len(nodeChannels) != 0 {
return nil, fmt.Errorf("cannot disconnect from peer(%x), "+ // If we are not in a dev environment or the configed dev value
"all active channels with the peer need to be closed "+ // `unsafedisconnect` is false, we return an error since there
"first", pubKeyBytes) // are active channels.
if !r.cfg.Dev.GetUnsafeDisconnect() {
return nil, fmt.Errorf("cannot disconnect from "+
"peer(%x), still has %d active channels",
pubKeyBytes, len(nodeChannels))
}
// We are in a dev environment, print a warning log and
// disconnect.
rpcsLog.Warnf("UnsafeDisconnect mode, disconnecting from "+
"peer(%x) while there are %d active channels",
pubKeyBytes, len(nodeChannels))
} }
// With all initial validation complete, we'll now request that the // With all initial validation complete, we'll now request that the
// server disconnects from the peer. // server disconnects from the peer.
if err := r.server.DisconnectPeer(peerPubKey); err != nil { err = r.server.DisconnectPeer(peerPubKey)
if err != nil {
return nil, fmt.Errorf("unable to disconnect peer: %v", err) return nil, fmt.Errorf("unable to disconnect peer: %v", err)
} }