go_study/fabric-main/internal/peer/node/unjoin.go

63 lines
1.7 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package node
import (
"path/filepath"
coreconfig "github.com/hyperledger/fabric/core/config"
"github.com/hyperledger/fabric/core/ledger/kvledger"
"github.com/hyperledger/fabric/core/transientstore"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
func unjoinCmd() *cobra.Command {
var channelID string
cmd := &cobra.Command{
Use: "unjoin",
Short: "Unjoin the peer from a channel.",
Long: "Unjoin the peer from a channel. When the command is executed, the peer must be offline.",
RunE: func(cmd *cobra.Command, args []string) error {
if channelID == common.UndefinedParamValue {
return errors.New("Must supply channel ID")
}
if err := unjoinChannel(channelID); err != nil {
return err
}
return nil
},
}
flags := cmd.Flags()
flags.StringVarP(&channelID, "channelID", "c", common.UndefinedParamValue, "Channel to unjoin.")
return cmd
}
// unjoin the peer from a channel.
func unjoinChannel(channelID string) error {
// transient storage must be scrubbed prior to removing the kvledger for the channel. Once the
// kvledger storage has been removed, a subsequent ledger removal will return a "no such ledger" error.
// By removing the transient storage prior to deleting the ledger, a crash may be recovered by re-running
// the peer unjoin.
transientStoragePath := filepath.Join(coreconfig.GetPath("peer.fileSystemPath"), "transientstore")
if err := transientstore.Drop(transientStoragePath, channelID); err != nil {
return err
}
config := ledgerConfig()
if err := kvledger.UnjoinChannel(config, channelID); err != nil {
return err
}
return nil
}