Fabric-sdk-go client.Query returns error: failed to create transactor: Channel_Cfg_Cache - cache is closed

435 views Asked by At

I am trying to make a simple demo using the fabric-sdk-go. I wonder anybod know why the code below ("client.Query") returns the error "failed to create transactor: Channel_Cfg_Cache - cache is closed"?


func initSdkClient() (*channel.Client){
    sdk, err := fabsdk.New(config.FromFile("config.yaml"))
    if err != nil {
        logger.Fatalf("Failed to create new SDK: %s", err)
    }
    defer sdk.Close()

    //prepare channel client context using client context
    clientChannelContext := sdk.ChannelContext(channelID, fabsdk.WithUser("User1"), fabsdk.WithOrg(orgName))
    // Channel client is used to query and execute transactions (Org1 is default org)
    client, err := channel.New(clientChannelContext)
    if err != nil {
        logger.Fatalf("Failed to create new channel client: %s", err)
    }
    return client
}

func queryCC(client *channel.Client, targetEndpoints ...string) []byte {
    response, err := client.Query(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: defaultQueryArgs},
        channel.WithRetry(retry.DefaultChannelOpts),
        channel.WithTargetEndpoints(targetEndpoints...),
    )
    if err != nil {
        ***logger.Fatalf("Failed to query funds: %s", err)*** // error: failed to create transactor: Channel_Cfg_Cache - cache is closed
    }
    return response.Payload
}

func main() {
    client := initSdkClient()

    existingValue := queryCC(client)
    logger.Info(existingValue)


    logger.Info("hello, world\n")
}
1

There are 1 answers

0
Captain Levi On

Probably because you're closing the SDK instance at the end of initSdkClient function. Rather close the SDK at the end of main function.

Do something like

type Setup struct {
    sdk    *fabsdk.FabricSDK
    client *channel.Client
}

func (setup *Setup) initSdkClient() *channel.Client {
    sdk, err := fabsdk.New(config.FromFile("config.yaml"))
    if err != nil {
        fmt.Errorf("Failed to create new SDK: %s", err)
    }
    setup.sdk = sdk
    //prepare channel client context using client context
    clientChannelContext := setup.sdk.ChannelContext(channelID, fabsdk.WithUser("User1"), fabsdk.WithOrg(orgName))
    // Channel client is used to query and execute transactions (Org1 is default org)
    client, err := channel.New(clientChannelContext)
    if err != nil {
        fmt.Errorf("Failed to create new channel client: %s", err)
    }
    setup.client = client
    return client
}

func (setup *Setup) queryCC(client *channel.Client, targetEndpoints ...string) []byte {
    response, err := setup.client.Query(channel.Request{ChaincodeID: ccID, Fcn: "invoke", Args: defaultQueryArgs},
        channel.WithRetry(retry.DefaultChannelOpts),
        channel.WithTargetEndpoints(targetEndpoints...),
    )
    if err != nil {
        fmt.Errorf("Failed to query funds: %s", err)
    }
    return response.Payload
}

func main() {
    var setup Setup
    client := setup.initSdkClient()
    defer setup.sdk.Close()

    existingValue := setup.queryCC(client)

}