当我尝试在无服务器框架的/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 不支持fallocate
和fallocate64
系统调用导致的。在这种情况下,亚马逊没有返回正确的错误代码(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;
}
现在,将其编译为共享对象
,如下所示gcc -shared fix.c -o fix.so
然后将其添加到 ZIP 文件的根目录:
zip layer.zip fix.so
从此压缩创建新的 lambda 层
将 lambda 层添加到 lambda 函数
最后,通过将环境值
LD_PRELOAD
配置为 Lambda/opt/fix.so
值来加载共享对象。享受。