Skip to content

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

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions