Search code examples
javaxodus

Xodus VFS not able to persist bytes


The problem with the code below is that the VFS does not seem to be able to persist the byte array. As Xodus VFS writes zero byte:

  @Override
  public FileModel put(
      String appId, String namespace, String name, InputStream is) {
    final FileModel[] createdFile = {null};
    final Environment env = manager.getEnvironment(xodusRoot, appId);
    final VirtualFileSystem vfs  = new VirtualFileSystem(env);
    env.executeInTransaction(
        new TransactionalExecutable() {
          @Override
          public void execute(@NotNull final Transaction txn) {
            final File file = vfs.openFile(txn, name, true);;
            try {
              byte[] ba = ByteStreams.toByteArray(is);
              LOG.info("Byte array size: " + ba.length); // Size: 3466
              vfs.writeFile(txn, file).write(ba, 0, ba.length);
            } catch (IOException e) {
              e.printStackTrace();
            }
            long fileSize = vfs.getFileLength(txn, file);
            LOG.info("File Size: " + fileSize); // Size: 0 <----
            createdFile[0] = new FileModel();
            createdFile[0].setDescriptor(file.getDescriptor());
            createdFile[0].setName(name);
            createdFile[0].setCreated(file.getCreated());
            createdFile[0].setModified(file.getLastModified());
          }
        });
    vfs.shutdown();
    return createdFile[0];
  }

And here's the log:

[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] INFO jetbrains.exodus.env.EnvironmentImpl - Exodus environment created: \tmp\xodus\master
[qtp1007568224-16] WARN jetbrains.exodus.io.FileDataWriter - Can't open directory channel. Log directory fsync won't be performed.
[qtp1007568224-16] INFO jetbrains.exodus.env.EnvironmentImpl - Exodus environment created: \tmp\xodus\ab5b92099ad443259b4deaf8df6facc4
[qtp1007568224-16] INFO com.backend.repository.jee.JeeXodusVFSRepository - Byte array size: 3466
[qtp1007568224-16] INFO com.backend.repository.jee.JeeXodusVFSRepository - File Size: 0
[qtp1007568224-16] INFO com.backend.resource.jee.JeeFileServerResource - File size=3466; File.created=1575274836678; File.name="index.html"; File.modified=1575274836678; File.etag=<null>; File.descriptor=261; File.url=<null>

Solution

  • The method vfs.writeFile(txn, file) returns an OutputStream instance that should be closed to save written data.