posix_fallocate() 失败:打开 .realm 文件时不允许执行操作



当我尝试在无服务器框架的/tmp 目录中打开和下载 .realm 文件时,我收到以下错误。 {"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"Error: posix_fallocate(( failed: 操作不允许" }

Below is the code:
let realm = new Realm({path: '/tmp/custom.realm', schema: [schema1, schema2]});
realm.write(() => {
console.log('completed==');
});

编辑:这可能很快就会在 Realm-Core 中最终修复:请参阅问题 4957。


如果您在其他地方遇到此问题,这里有一个解决方法。

这是由于 AWS Lambda 不支持fallocatefallocate64系统调用导致的。在这种情况下,亚马逊没有返回正确的错误代码(EINVAL因为此文件系统不支持(,而是阻止了系统调用,使其返回EPERM。Realm-Core 的代码可以正确处理EINVAL返回值,但会对系统调用返回的意外EPERM感到困惑。

解决方案是将一个小的共享库作为层添加到lambda中:在Linux机器上或在lambda-ci Docker镜像中编译以下C文件:

#include <errno.h>
#include <fcntl.h>
int posix_fallocate(int __fd, off_t __offset, off_t __len) {
return EINVAL;
}
int posix_fallocate64(int __fd, off_t __offset, off_t __len) {
return EINVAL;
}
  1. 现在,将其编译为共享对象

    ,如下所示
    gcc -shared fix.c -o fix.so
    
  2. 然后将其添加到 ZIP 文件的根目录:

    zip layer.zip fix.so
    
  3. 从此压缩创建新的 lambda 层

  4. 将 lambda 层添加到 lambda 函数

  5. 最后,通过将环境值LD_PRELOAD配置为 Lambda/opt/fix.so值来加载共享对象。

  6. 享受。

相关内容

  • 没有找到相关文章

最新更新