commit
f6f3ab5b0b
@ -114,7 +114,7 @@ var (
|
||||
// computing our checksum.
|
||||
crcTable = crc32.MakeTable(crc32.Castagnoli)
|
||||
|
||||
// defaultPassphras is the default passphrase that will be used for
|
||||
// defaultPassphrase is the default passphrase that will be used for
|
||||
// encryption in the case that the user chooses not to specify their
|
||||
// own passphrase.
|
||||
defaultPassphrase = []byte("aezeed")
|
||||
@ -262,7 +262,7 @@ func encodeAD(version uint8, salt [saltSize]byte) [adSize]byte {
|
||||
}
|
||||
|
||||
// extractAD extracts an associated data from a fully encoded and enciphered
|
||||
// cipher seed. This is to be used when attempting to decrypt an enciphered
|
||||
// cipher seed. This is to be used when attempting to decrypt an enciphered
|
||||
// cipher seed.
|
||||
func extractAD(encipheredSeed [EncipheredCipherSeedSize]byte) [adSize]byte {
|
||||
var ad [adSize]byte
|
||||
|
@ -38,7 +38,7 @@ type Node interface {
|
||||
|
||||
// LocalChannel is a simple struct which contains relevant details of a
|
||||
// particular channel the local node has. The fields in this struct may be used
|
||||
// a signals for various AttachmentHeuristic implementations.
|
||||
// as signals for various AttachmentHeuristic implementations.
|
||||
type LocalChannel struct {
|
||||
// ChanID is the short channel ID for this channel as defined within
|
||||
// BOLT-0007.
|
||||
@ -118,7 +118,7 @@ type AttachmentDirective struct {
|
||||
// AttachmentHeuristic is one of the primary interfaces within this package.
|
||||
// Implementations of this interface will be used to implement a control system
|
||||
// which automatically regulates channels of a particular agent, attempting to
|
||||
// optimize channels opened/closed based on various heuristics. The purpose of
|
||||
// optimize channels opened/closed based on various heuristics. The purpose of
|
||||
// the interface is to allow an auto-pilot agent to decide if it needs more
|
||||
// channels, and if so, which exact channels should be opened.
|
||||
type AttachmentHeuristic interface {
|
||||
@ -170,7 +170,7 @@ type NodeMetric interface {
|
||||
// scores.
|
||||
type ScoreSettable interface {
|
||||
// SetNodeScores is used to set the internal map from NodeIDs to
|
||||
// scores. The passed scores must be in the range [0, 1.0]. The fist
|
||||
// scores. The passed scores must be in the range [0, 1.0]. The first
|
||||
// parameter is the name of the targeted heuristic, to allow
|
||||
// recursively target specific sub-heuristics. The returned boolean
|
||||
// indicates whether the targeted heuristic was found.
|
||||
|
@ -42,7 +42,7 @@ type ManagerCfg struct {
|
||||
// Manager is struct that manages an autopilot agent, making it possible to
|
||||
// enable and disable it at will, and hand it relevant external information.
|
||||
// It implements the autopilot grpc service, which is used to get data about
|
||||
// the running autopilot, and give it relevant information.
|
||||
// the running autopilot, and gives it relevant information.
|
||||
type Manager struct {
|
||||
started sync.Once
|
||||
stopped sync.Once
|
||||
@ -222,9 +222,9 @@ func (m *Manager) StartAgent() error {
|
||||
pilot.OnChannelClose(chanID)
|
||||
}
|
||||
|
||||
// If new nodes were added to the graph, or nod
|
||||
// information has changed, we'll poke autopilot
|
||||
// to see if it can make use of them.
|
||||
// If new nodes were added to the graph, or
|
||||
// node information has changed, we'll poke
|
||||
// autopilot to see if it can make use of them.
|
||||
if len(topChange.NodeUpdates) > 0 {
|
||||
pilot.OnNodeUpdates()
|
||||
}
|
||||
|
@ -62,8 +62,8 @@ func Dial(local keychain.SingleKeyECDH, netAddr *lnwire.NetAddress,
|
||||
}
|
||||
|
||||
// We'll ensure that we get ActTwo from the remote peer in a timely
|
||||
// manner. If they don't respond within 1s, then we'll kill the
|
||||
// connection.
|
||||
// manner. If they don't respond within handshakeReadTimeout, then
|
||||
// we'll kill the connection.
|
||||
err = conn.SetReadDeadline(time.Now().Add(handshakeReadTimeout))
|
||||
if err != nil {
|
||||
b.conn.Close()
|
||||
@ -229,7 +229,7 @@ func (c *Conn) Flush() (int, error) {
|
||||
return c.noise.Flush(c.conn)
|
||||
}
|
||||
|
||||
// Close closes the connection. Any blocked Read or Write operations will be
|
||||
// Close closes the connection. Any blocked Read or Write operations will be
|
||||
// unblocked and return errors.
|
||||
//
|
||||
// Part of the net.Conn interface.
|
||||
@ -261,7 +261,7 @@ func (c *Conn) SetDeadline(t time.Time) error {
|
||||
return c.conn.SetDeadline(t)
|
||||
}
|
||||
|
||||
// SetReadDeadline sets the deadline for future Read calls. A zero value for t
|
||||
// SetReadDeadline sets the deadline for future Read calls. A zero value for t
|
||||
// means Read will not time out.
|
||||
//
|
||||
// Part of the net.Conn interface.
|
||||
@ -269,9 +269,9 @@ func (c *Conn) SetReadDeadline(t time.Time) error {
|
||||
return c.conn.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
// SetWriteDeadline sets the deadline for future Write calls. Even if write
|
||||
// SetWriteDeadline sets the deadline for future Write calls. Even if write
|
||||
// times out, it may return n > 0, indicating that some of the data was
|
||||
// successfully written. A zero value for t means Write will not time out.
|
||||
// successfully written. A zero value for t means Write will not time out.
|
||||
//
|
||||
// Part of the net.Conn interface.
|
||||
func (c *Conn) SetWriteDeadline(t time.Time) error {
|
||||
|
@ -115,8 +115,8 @@ func (l *Listener) doHandshake(conn net.Conn) {
|
||||
}
|
||||
|
||||
// We'll ensure that we get ActOne from the remote peer in a timely
|
||||
// manner. If they don't respond within 1s, then we'll kill the
|
||||
// connection.
|
||||
// manner. If they don't respond within handshakeReadTimeout, then
|
||||
// we'll kill the connection.
|
||||
err := conn.SetReadDeadline(time.Now().Add(handshakeReadTimeout))
|
||||
if err != nil {
|
||||
brontideConn.conn.Close()
|
||||
@ -160,8 +160,8 @@ func (l *Listener) doHandshake(conn net.Conn) {
|
||||
}
|
||||
|
||||
// We'll ensure that we get ActTwo from the remote peer in a timely
|
||||
// manner. If they don't respond within 1 second, then we'll kill the
|
||||
// connection.
|
||||
// manner. If they don't respond within handshakeReadTimeout, then
|
||||
// we'll kill the connection.
|
||||
err = conn.SetReadDeadline(time.Now().Add(handshakeReadTimeout))
|
||||
if err != nil {
|
||||
brontideConn.conn.Close()
|
||||
|
@ -252,7 +252,7 @@ func (s *symmetricState) EncryptAndHash(plaintext []byte) []byte {
|
||||
}
|
||||
|
||||
// DecryptAndHash returns the authenticated decryption of the passed
|
||||
// ciphertext. When encrypting the handshake digest (h) is used as the
|
||||
// ciphertext. When encrypting the handshake digest (h) is used as the
|
||||
// associated data to the AEAD cipher.
|
||||
func (s *symmetricState) DecryptAndHash(ciphertext []byte) ([]byte, error) {
|
||||
plaintext, err := s.Decrypt(s.handshakeDigest[:], nil, ciphertext)
|
||||
@ -870,7 +870,7 @@ func (b *Machine) ReadHeader(r io.Reader) (uint32, error) {
|
||||
// ReadBody attempts to ready the next message body from the passed io.Reader.
|
||||
// The provided buffer MUST be the length indicated by the packet length
|
||||
// returned by the preceding call to ReadHeader. In the case of an
|
||||
// authentication eerror, a non-nil error is returned.
|
||||
// authentication error, a non-nil error is returned.
|
||||
func (b *Machine) ReadBody(r io.Reader, buf []byte) ([]byte, error) {
|
||||
// Next, using the length read from the packet header, read the
|
||||
// encrypted packet itself into the buffer allocated by the read
|
||||
|
@ -5,7 +5,7 @@ import (
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
// AnnounceSignatures this is a direct message between two endpoints of a
|
||||
// AnnounceSignatures is a direct message between two endpoints of a
|
||||
// channel and serves as an opt-in mechanism to allow the announcement of
|
||||
// the channel to the rest of the network. It contains the necessary
|
||||
// signatures by the sender to construct the channel announcement message.
|
||||
|
@ -11,9 +11,9 @@ import (
|
||||
// to report their local state, and their current knowledge of the state of the
|
||||
// remote commitment chain. If a deviation is detected and can be recovered
|
||||
// from, then the necessary messages will be retransmitted. If the level of
|
||||
// desynchronization if irreconcilable, then the channel will be force closed.
|
||||
// desynchronization is irreconcilable, then the channel will be force closed.
|
||||
type ChannelReestablish struct {
|
||||
// ChanID is the channel ID of the channel state we're attempting
|
||||
// ChanID is the channel ID of the channel state we're attempting to
|
||||
// synchronize with the remote party.
|
||||
ChanID ChannelID
|
||||
|
||||
@ -105,7 +105,7 @@ func (a *ChannelReestablish) Decode(r io.Reader, pver uint32) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// This message has to currently defined optional fields. As a result,
|
||||
// This message has currently defined optional fields. As a result,
|
||||
// we'll only proceed if there's still bytes remaining within the
|
||||
// reader.
|
||||
//
|
||||
@ -127,7 +127,7 @@ func (a *ChannelReestablish) Decode(r io.Reader, pver uint32) error {
|
||||
copy(a.LastRemoteCommitSecret[:], buf[:])
|
||||
|
||||
// We'll conclude by parsing out the commitment point. We don't check
|
||||
// the error in this case, as it hey included the commit secret, then
|
||||
// the error in this case, as it has included the commit secret, then
|
||||
// they MUST also include the commit point.
|
||||
return ReadElement(r, &a.LocalUnrevokedCommitPoint)
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ type ChannelUpdate struct {
|
||||
// ShortChannelID is the unique description of the funding transaction.
|
||||
ShortChannelID ShortChannelID
|
||||
|
||||
// Timestamp allows ordering in the case of multiple announcements. We
|
||||
// Timestamp allows ordering in the case of multiple announcements. We
|
||||
// should ignore the message if timestamp is not greater than
|
||||
// the last-received.
|
||||
Timestamp uint32
|
||||
|
@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
// CommitSig is sent by either side to stage any pending HTLC's in the
|
||||
// receiver's pending set into a new commitment state. Implicitly, the new
|
||||
// receiver's pending set into a new commitment state. Implicitly, the new
|
||||
// commitment transaction constructed which has been signed by CommitSig
|
||||
// includes all HTLC's in the remote node's pending set. A CommitSig message
|
||||
// may be sent after a series of UpdateAddHTLC/UpdateFulfillHTLC messages in
|
||||
|
@ -15,7 +15,7 @@ const (
|
||||
ErrMaxPendingChannels FundingError = 1
|
||||
|
||||
// ErrSynchronizingChain is returned by a remote peer that receives a
|
||||
// channel update or a funding request while their still syncing to the
|
||||
// channel update or a funding request while it's still syncing to the
|
||||
// latest state of the blockchain.
|
||||
ErrSynchronizingChain FundingError = 2
|
||||
|
||||
@ -39,7 +39,7 @@ func (e FundingError) String() string {
|
||||
}
|
||||
}
|
||||
|
||||
// Error returns the human redable version of the target FundingError.
|
||||
// Error returns the human readable version of the target FundingError.
|
||||
//
|
||||
// NOTE: Satisfies the Error interface.
|
||||
func (e FundingError) Error() string {
|
||||
|
@ -66,7 +66,7 @@ const (
|
||||
// able to decode the new TLV information included in the onion packet.
|
||||
TLVOnionPayloadRequired FeatureBit = 8
|
||||
|
||||
// TLVOnionPayloadRequired is an optional feature bit that indicates a
|
||||
// TLVOnionPayloadOptional is an optional feature bit that indicates a
|
||||
// node is able to decode the new TLV information included in the onion
|
||||
// packet.
|
||||
TLVOnionPayloadOptional FeatureBit = 9
|
||||
@ -114,7 +114,7 @@ const (
|
||||
// outputs.
|
||||
AnchorsRequired FeatureBit = 20
|
||||
|
||||
// AnchorsRequired is an optional feature bit that signals that the
|
||||
// AnchorsOptional is an optional feature bit that signals that the
|
||||
// node supports channels to be made using commitments having anchor
|
||||
// outputs.
|
||||
AnchorsOptional FeatureBit = 21
|
||||
@ -126,7 +126,7 @@ const (
|
||||
// message to signal the type of message, that leaves us with 65533 bytes
|
||||
// for the init message itself. Next, we reserve 4 bytes to encode the
|
||||
// lengths of both the local and global feature vectors, so 65529 bytes
|
||||
// for the local and global features. Knocking off one byte for the sake
|
||||
// for the local and global features. Knocking off one byte for the sake
|
||||
// of the calculation, that leads us to 32764 bytes for each feature
|
||||
// vector, or 131056 different features.
|
||||
maxAllowedSize = 32764
|
||||
@ -427,7 +427,7 @@ func (fv *FeatureVector) UnknownRequiredFeatures() []FeatureBit {
|
||||
|
||||
// Name returns a string identifier for the feature represented by this bit. If
|
||||
// the bit does not represent a known feature, this returns a string indicating
|
||||
// as much.
|
||||
// as such.
|
||||
func (fv *FeatureVector) Name(bit FeatureBit) string {
|
||||
name, known := fv.featureNames[bit]
|
||||
if !known {
|
||||
|
@ -12,7 +12,7 @@ type Init struct {
|
||||
// merged with those presented in Features.
|
||||
GlobalFeatures *RawFeatureVector
|
||||
|
||||
// Features is a feature vector containing a the features supported by
|
||||
// Features is a feature vector containing the features supported by
|
||||
// the remote node.
|
||||
//
|
||||
// NOTE: Older nodes may place some features in GlobalFeatures, but all
|
||||
|
@ -34,9 +34,9 @@ func (e ErrInvalidNodeAlias) Error() string {
|
||||
return "node alias has non-utf8 characters"
|
||||
}
|
||||
|
||||
// NodeAlias a hex encoded UTF-8 string that may be displayed as an alternative
|
||||
// to the node's ID. Notice that aliases are not unique and may be freely
|
||||
// chosen by the node operators.
|
||||
// NodeAlias is a hex encoded UTF-8 string that may be displayed as an
|
||||
// alternative to the node's ID. Notice that aliases are not unique and may be
|
||||
// freely chosen by the node operators.
|
||||
type NodeAlias [32]byte
|
||||
|
||||
// NewNodeAlias creates a new instance of a NodeAlias. Verification is
|
||||
|
@ -39,7 +39,7 @@ const (
|
||||
// FlagPerm error flag indicates a permanent failure.
|
||||
FlagPerm FailCode = 0x4000
|
||||
|
||||
// FlagNode error flag indicates anode failure.
|
||||
// FlagNode error flag indicates a node failure.
|
||||
FlagNode FailCode = 0x2000
|
||||
|
||||
// FlagUpdate error flag indicates a new channel update is enclosed
|
||||
|
@ -106,7 +106,7 @@ type OpenChannel struct {
|
||||
DelayedPaymentPoint *btcec.PublicKey
|
||||
|
||||
// HtlcPoint is the base point used to derive the set of keys for this
|
||||
// party that will be used within the HTLC public key scripts. This
|
||||
// party that will be used within the HTLC public key scripts. This
|
||||
// value is combined with the receiver's revocation base point in order
|
||||
// to derive the keys that are used within HTLC scripts.
|
||||
HtlcPoint *btcec.PublicKey
|
||||
|
@ -70,7 +70,7 @@ func ErrUnknownShortChanIDEncoding(encoding ShortChanIDEncoding) error {
|
||||
// message.
|
||||
type QueryShortChanIDs struct {
|
||||
// ChainHash denotes the target chain that we're querying for the
|
||||
// channel channel ID's of.
|
||||
// channel ID's of.
|
||||
ChainHash chainhash.Hash
|
||||
|
||||
// EncodingType is a signal to the receiver of the message that
|
||||
@ -155,8 +155,8 @@ func decodeShortChanIDs(r io.Reader) (ShortChanIDEncoding, []ShortChannelID, err
|
||||
// In this encoding, we'll simply read a sort array of encoded short
|
||||
// channel ID's from the buffer.
|
||||
case EncodingSortedPlain:
|
||||
// If after extracting the encoding type, then number of
|
||||
// remaining bytes instead a whole multiple of the size of an
|
||||
// If after extracting the encoding type, the number of
|
||||
// remaining bytes is not a whole multiple of the size of an
|
||||
// encoded short channel ID (8 bytes), then we'll return a
|
||||
// parsing error.
|
||||
if len(queryBody)%8 != 0 {
|
||||
@ -254,7 +254,7 @@ func decodeShortChanIDs(r io.Reader) (ShortChanIDEncoding, []ShortChannelID, err
|
||||
"ID: %v", err)
|
||||
}
|
||||
|
||||
// We successfully read the next ID, so well collect
|
||||
// We successfully read the next ID, so we'll collect
|
||||
// that in the set of final ID's to return.
|
||||
shortChanIDs = append(shortChanIDs, cid)
|
||||
|
||||
|
@ -9,7 +9,7 @@ import (
|
||||
// ReplyShortChanIDsEnd is a message that marks the end of a streaming message
|
||||
// response to an initial QueryShortChanIDs message. This marks that the
|
||||
// receiver of the original QueryShortChanIDs for the target chain has either
|
||||
// sent all adequate responses it knows of, or doesn't now of any short chan
|
||||
// sent all adequate responses it knows of, or doesn't know of any short chan
|
||||
// ID's for the target chain.
|
||||
type ReplyShortChanIDsEnd struct {
|
||||
// ChainHash denotes the target chain that we're respond to a short
|
||||
|
@ -26,7 +26,7 @@ type RevokeAndAck struct {
|
||||
|
||||
// NextRevocationKey is the next commitment point which should be used
|
||||
// for the next commitment transaction the remote peer creates for us.
|
||||
// This, in conjunction without revocation base point will be used to
|
||||
// This, in conjunction with revocation base point will be used to
|
||||
// create the proper revocation key used within the commitment
|
||||
// transaction.
|
||||
NextRevocationKey *btcec.PublicKey
|
||||
|
@ -216,8 +216,8 @@ type Config struct {
|
||||
// SigPool is used when creating *lnwallet.LightningChannel instances.
|
||||
SigPool *lnwallet.SigPool
|
||||
|
||||
// Wallet is used to publish transactions and generate delivery scripts
|
||||
// during the coop close process.
|
||||
// Wallet is used to publish transactions and generates delivery
|
||||
// scripts during the coop close process.
|
||||
Wallet *lnwallet.LightningWallet
|
||||
|
||||
// ChainNotifier is used to receive confirmations of a coop close
|
||||
@ -438,7 +438,7 @@ func NewBrontide(cfg Config) *Brontide {
|
||||
}
|
||||
|
||||
// Start starts all helper goroutines the peer needs for normal operations. In
|
||||
// the case this peer has already been started, then this function is a loop.
|
||||
// the case this peer has already been started, then this function is a noop.
|
||||
func (p *Brontide) Start() error {
|
||||
if atomic.AddInt32(&p.started, 1) != 1 {
|
||||
return nil
|
||||
@ -1184,10 +1184,10 @@ func waitUntilLinkActive(p *Brontide,
|
||||
}
|
||||
|
||||
// newChanMsgStream is used to create a msgStream between the peer and
|
||||
// particular channel link in the htlcswitch. We utilize additional
|
||||
// particular channel link in the htlcswitch. We utilize additional
|
||||
// synchronization with the fundingManager to ensure we don't attempt to
|
||||
// dispatch a message to a channel before it is fully active. A reference to the
|
||||
// channel this stream forwards to his held in scope to prevent unnecessary
|
||||
// channel this stream forwards to is held in scope to prevent unnecessary
|
||||
// lookups.
|
||||
func newChanMsgStream(p *Brontide, cid lnwire.ChannelID) *msgStream {
|
||||
|
||||
@ -1298,7 +1298,7 @@ out:
|
||||
continue
|
||||
|
||||
// If they sent us an address type that we don't yet
|
||||
// know of, then this isn't a dire error, so we'll
|
||||
// know of, then this isn't a wire error, so we'll
|
||||
// simply continue parsing the remainder of their
|
||||
// messages.
|
||||
case *lnwire.ErrUnknownAddrType:
|
||||
@ -1316,7 +1316,7 @@ out:
|
||||
continue
|
||||
|
||||
// If the error we encountered wasn't just a message we
|
||||
// didn't recognize, then we'll stop all processing s
|
||||
// didn't recognize, then we'll stop all processing as
|
||||
// this is a fatal error.
|
||||
default:
|
||||
break out
|
||||
@ -2053,7 +2053,7 @@ func (p *Brontide) channelManager() {
|
||||
defer p.wg.Done()
|
||||
|
||||
// reenableTimeout will fire once after the configured channel status
|
||||
// interval has elapsed. This will trigger us to sign new channel
|
||||
// interval has elapsed. This will trigger us to sign new channel
|
||||
// updates and broadcast them with the "disabled" flag unset.
|
||||
reenableTimeout := time.After(p.cfg.ChanActiveTimeout)
|
||||
|
||||
@ -2185,7 +2185,7 @@ out:
|
||||
close(newChanReq.err)
|
||||
|
||||
// We've just received a local request to close an active
|
||||
// channel. If will either kick of a cooperative channel
|
||||
// channel. It will either kick of a cooperative channel
|
||||
// closure negotiation, or be a notification of a breached
|
||||
// contract that should be abandoned.
|
||||
case req := <-p.localCloseChanReqs:
|
||||
@ -2379,7 +2379,7 @@ func (p *Brontide) fetchActiveChanCloser(chanID lnwire.ChannelID) (
|
||||
func chooseDeliveryScript(upfront,
|
||||
requested lnwire.DeliveryAddress) (lnwire.DeliveryAddress, error) {
|
||||
|
||||
// If no upfront upfront shutdown script was provided, return the user
|
||||
// If no upfront shutdown script was provided, return the user
|
||||
// requested address (which may be nil).
|
||||
if len(upfront) == 0 {
|
||||
return requested, nil
|
||||
@ -2545,7 +2545,7 @@ func (p *Brontide) handleLinkFailure(failure linkFailureReport) {
|
||||
p.WipeChannel(&failure.chanPoint)
|
||||
|
||||
// If the error encountered was severe enough, we'll now force close the
|
||||
// channel to prevent readding it to the switch in the future.
|
||||
// channel to prevent reading it to the switch in the future.
|
||||
if failure.linkErr.ForceClose {
|
||||
peerLog.Warnf("Force closing link(%v)",
|
||||
failure.shortChanID)
|
||||
|
@ -26,7 +26,7 @@ type ReadBuffer struct {
|
||||
}
|
||||
|
||||
// NewReadBuffer returns a freshly instantiated ReadBuffer, using the given
|
||||
// gcInterval and expieryInterval.
|
||||
// gcInterval and expiryInterval.
|
||||
func NewReadBuffer(gcInterval, expiryInterval time.Duration) *ReadBuffer {
|
||||
return &ReadBuffer{
|
||||
pool: NewRecycle(
|
||||
|
@ -86,7 +86,7 @@ func (w *Write) newWorkerState() WorkerState {
|
||||
}
|
||||
|
||||
// Cleanup returns the writeBuf to the underlying buffer pool, and removes the
|
||||
// goroutine's reference to the readBuf and encapsulating buf.
|
||||
// goroutine's reference to the writeBuf and encapsulating buf.
|
||||
func (w *writeWorkerState) Cleanup() {
|
||||
w.bufferPool.Return(w.writeBuf)
|
||||
w.writeBuf = nil
|
||||
|
@ -13,7 +13,7 @@ const (
|
||||
DefaultWriteBufferGCInterval = 15 * time.Second
|
||||
|
||||
// DefaultWriteBufferExpiryInterval is the default, minimum interval
|
||||
// that must elapse before a Write will release a buffer.Write. The
|
||||
// that must elapse before a Write will release a buffer.Write. The
|
||||
// maximum time before the buffer can be released is equal to the expiry
|
||||
// interval plus the gc interval.
|
||||
DefaultWriteBufferExpiryInterval = 30 * time.Second
|
||||
|
Loading…
Reference in New Issue
Block a user