Skip to content

Cannot add attachments to inmemory logs without generating a FileAlreadyExistsException. #3438

@Peyton-Hill-CLS

Description

@Peyton-Hill-CLS

Text logs can be created like normal, but when attempting to create a log with an attachment I get the following output on my terminal from phoebus:

java.lang.IllegalArgumentException: argument "content" is null
        at com.fasterxml.jackson.databind.ObjectMapper._assertNotNull(ObjectMapper.java:4757)
        at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:3040)
        at org.phoebus.logbook.olog.ui.write.LogEntryEditorController.lambda$getServerSideStaticData$39(LogEntryEditorController.java:825)
        at org.phoebus.framework.jobs.Job.execute(Job.java:50)
        at org.phoebus.framework.jobs.JobManager.execute(JobManager.java:54)
        at org.phoebus.framework.jobs.JobManager.lambda$schedule$0(JobManager.java:45)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)

2025-06-18 18:36:54 WARNING [org.phoebus.applications.logbook.InMemoryLogClient] failed to get in memory attachment
java.nio.file.FileAlreadyExistsException: /tmp/phoebus_tmp_file10766245626850128112.png
        at java.base/sun.nio.fs.UnixFileSystem.copy(UnixFileSystem.java:1044)
        at java.base/sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:300)
        at java.base/java.nio.file.Files.copy(Files.java:1305)
        at org.phoebus.applications.logbook.InMemoryLogClient.lambda$set$0(InMemoryLogClient.java:131)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at org.phoebus.applications.logbook.InMemoryLogClient.set(InMemoryLogClient.java:139)
        at org.phoebus.logbook.olog.ui.write.LogEntryEditorController.lambda$submit$30(LogEntryEditorController.java:612)
        at org.phoebus.framework.jobs.Job.execute(Job.java:50)
        at org.phoebus.framework.jobs.JobManager.execute(JobManager.java:54)
        at org.phoebus.framework.jobs.JobManager.lambda$schedule$0(JobManager.java:45)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
        at java.base/java.lang.Thread.run(Thread.java:1583)

2025-06-18 18:36:54 WARNING [org.phoebus.framework.jobs] Job 'Submit Log Entry' failed
java.lang.NullPointerException: Cannot invoke "org.phoebus.logbook.Attachment.getFile()" because "a" is null
        at org.phoebus.logbook.LogEntryImpl.lambda$new$2(LogEntryImpl.java:41)
        at java.base/java.util.stream.Collectors.lambda$uniqKeysMapAccumulator$1(Collectors.java:179)
        at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
        at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at org.phoebus.logbook.LogEntryImpl.<init>(LogEntryImpl.java:41)
        at org.phoebus.logbook.LogEntryImpl$LogEntryBuilder.build(LogEntryImpl.java:303)
        at org.phoebus.applications.logbook.InMemoryLogClient.set(InMemoryLogClient.java:143)
        at org.phoebus.logbook.olog.ui.write.LogEntryEditorController.lambda$submit$30(LogEntryEditorController.java:612)
        at org.phoebus.framework.jobs.Job.execute(Job.java:50)
        at org.phoebus.framework.jobs.JobManager.execute(JobManager.java:54)

is used to find a temporary file path, but this also creates an empty file. Per the JavaDocs of Files.copy on the following line,

Throws:
FileAlreadyExistsException – if the target file exists but cannot be replaced because the REPLACE_EXISTING option is not specified (optional specific exception)

So

Files.copy(file.toPath(), tempFile.toPath());

should probably be replaced with

Files.copy(file.toPath(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions