Golang GCP 存储客户端内存泄漏

我在 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 会导致内存泄漏(至少上传有效)


缥缈止盈
浏览 136回答 2
2回答

胡说叔叔

我不知道您如何创建 HttpClient。在任何情况下,如果你指定了你的 HTTPClient,它就会被使用,而这个默认不是但是,使用的传输层是您的 HTTPClient 之一。默认情况下,它不嵌入库默认创建的安全层(并且使用您的凭据)。您必须在 HTTPClient 中重现此逻辑。因此,当您调用端点时,您调用它时没有任何安全标头,因此,您的 401 错误是正常的。

森林海

我相信这将允许您使用自己的 HTTP 客户端。&nbsp; &nbsp; import {&nbsp; &nbsp; &nbsp; &nbsp;gcpTransport "google.golang.org/api/transport/http"&nbsp; &nbsp; }&nbsp; &nbsp; ...&nbsp; &nbsp; httpClient.Transport, err = gcpTransport.NewTransport(ctx, option.WithCredentialsFile(cred))&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; client, err := storage.NewClient(ctx, option.WithHTTPClient(httpClient))&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; return err&nbsp; &nbsp; }&nbsp; &nbsp; defer client.Close()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go