Golang GCP存储客户端内存泄漏

时间:2020-04-01 06:11:20

标签: go google-cloud-platform google-cloud-storage

我在github https://github.com/googleapis/google-cloud-go/issues/1025上阅读了以下问题,发现所创建的空闲连接存在内存泄漏,因此将HTTP客户端添加到ClientOption可以解决问题。但是我想使用'WithCredentialsFile'选项实现它,但根据文档显示,'WithHTTPClient'不兼容。

下面是我的方法:

    client, err := storage.NewClient(ctx, option.WithCredentialsFile(cred), option.WithHTTPClient(httpClient))
    if err != nil {
        return err
    }
    defer client.Close()

我总是收到以下错误:

"googleapi: Error 401: Anonymous caller does not have storage.objects.create access to <filepath>, required"

对此有任何解决方法吗?

更新: 我在调用newClient时尝试了以下方法来摆脱withCred

    os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", cre)

    client, err := storage.NewClient(ctx, option.WithHTTPClient(httpClient))
    if err != nil {
        return err
    }
    defer client.Close()

但是它仍然导致上述错误。虽然如果我尝试删除withHttp会导致内存泄漏(至少可以上传)

2 个答案:

答案 0 :(得分:1)

我不知道您如何创建HttpClient。无论如何,如果您指定HTTPClient,it is used and this one by default not

但是,使用的传输层就是您的HTTPClient之一。默认情况下,它不会嵌入库默认情况下(以及使用您的凭据)创建的安全层。您必须在HTTPClient中重现此逻辑。

因此,在调用端点时,调用该端点时没有任何安全标头,因此您的401错误是正常的。

答案 1 :(得分:0)

我相信这将允许您使用自己的 HTTP 客户端。

    import {
       gcpTransport "google.golang.org/api/transport/http"
    }

    ...

    httpClient.Transport, err = gcpTransport.NewTransport(ctx, option.WithCredentialsFile(cred))
    if err != nil {
        return err
    }
    client, err := storage.NewClient(ctx, option.WithHTTPClient(httpClient))
    if err != nil {
        return err
    }
    defer client.Close()
相关问题