【问题标题】:IO Exception when writing files to Google Cloud Storage将文件写入 Google Cloud Storage 时出现 IO 异常
【发布时间】:2012-05-27 04:45:39
【问题描述】:

我正在尝试将文件从 Google App Engine 写入 Google Cloud,并使用后端处理将一堆文件写入 Google 云存储的请求。但似乎我在大约 5 分钟内得到了 IOException(我尝试了不同的文件大小,每个文件的线程休眠 30 秒等,只有时间似乎是一致的)。

然后我测试了以下代码:

         String testString = "1,1,1,1,1,1,1,1"; 
         for (int i = 0; i < 200; i++) {
            log.info("Dumping file " + i);
            String fileName = "test/test" + i + ".csv";
            FileService fs = FileServiceFactory.getFileService();
            GSFileOptionsBuilder optionsBuilder = new GSFileOptionsBuilder()
                .setBucket(BUCKET_NAME)
                .setKey(fileName)
                .setAcl("public_read");
            AppEngineFile writableFile = fs.createNewGSFile(optionsBuilder.build());
            FileWriteChannel writeChannel = fs.openWriteChannel(writableFile, true);
            PrintWriter out = new PrintWriter(Channels.newWriter(writeChannel, "UTF8"));
            for (int j = 0; j < 10; j++) { 
                out.println(testString);
            }
            out.close();
            writeChannel.closeFinally();
            Thread.sleep(30000);
        }

我得到 IOException 如下:

java.io.IOException
    at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:617)
    at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:590)
    at com.google.appengine.api.files.FileServiceImpl.create(FileServiceImpl.java:498)
    at com.google.appengine.api.files.FileServiceImpl.createNewGSFile(FileServiceImpl.java:153)

在谷歌云存储桶中,11个文件被写入并且是好的(每个有160字节),并且在创建第12个文件时请求失败。对于我的真实应用程序,它将在 writeChannel.closeFinally() 上失败。

java.io.IOException
    at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:617)
    at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:590)
    at com.google.appengine.api.files.FileServiceImpl.close(FileServiceImpl.java:551)
    at com.google.appengine.api.files.FileServiceImpl.close(FileServiceImpl.java:441)
    at com.google.appengine.api.files.FileWriteChannelImpl.closeFinally(FileWriteChannelImpl.java:81)

顺便说一句。我确信我授予对我的 GAE 应用程序的 google 服务帐户的完全控制访问权限,以便写入相应的存储桶。

非常感谢!

【问题讨论】:

  • 10MB 大小限制是多少? Google Storage 或 Blobstore 中的文件没有大小限制。
  • @StuartLangley :每个请求的限制指定为here。我基本上想将谷歌应用引擎中的数据传输到谷歌云存储,但是在写入约 40MB 数据(以多个块)后,我不断收到 IO 异常。我已经用一些错误堆栈跟踪更新了这个问题。感谢您的帮助!
  • 没有 10MB 的限制 - 每次调用有 32MB 的限制。您是否已将应用服务帐号添加到 Google Storage 存储桶,以便应用可以写入存储桶?
  • @StuartLangley:感谢您澄清这一点。我尝试了一些测试并缩小了问题范围,并相应地修改了问题。我确信我通过使用 gsutil 的“setacl”给我的 GAE 应用程序 FULL_CONTROL 特权(一些文件是写在谷歌云存储中的)。现在的问题似乎是超出了最后期限的异常。谢谢!

标签: google-app-engine google-cloud-storage


【解决方案1】:

文件 API 仍处于试验阶段 - 我认为您现在只是遇到了该服务的一般问题,因为它仍处于试验阶段。

我知道在提高此服务的可靠性方面正在进行一些非常积极的工作,因此现在您可能应该进行防御性编码并在看到此类暂时性错误时实施重试。

【讨论】:

  • 感谢您的回答。实际上这个问题是相当一致的,每次我运行上面的代码时,它都会以同样的方式失败。希望以后能解决这个问题。
  • 您对这个问题有任何结论吗?
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
相关资源
最近更新 更多