Skip to content

Commit 903caea

Browse files
authored
Fix TraceFileObserver NPE when trace file already exists (#6891)
Signed-off-by: Rob Syme <rob.syme@gmail.com>
1 parent 76927c2 commit 903caea

2 files changed

Lines changed: 58 additions & 7 deletions

File tree

modules/nextflow/src/main/groovy/nextflow/trace/TraceFileObserver.groovy

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,13 @@ class TraceFileObserver implements TraceObserverV2 {
171171
Files.createDirectories(parent)
172172

173173
// create a new trace file
174-
traceFile = new PrintWriter(TraceHelper.newFileWriter(tracePath,overwrite, 'Trace'))
174+
try {
175+
traceFile = new PrintWriter(TraceHelper.newFileWriter(tracePath, overwrite, 'Trace'))
176+
}
177+
catch (Exception e) {
178+
log.warn "Failed to create trace file: ${tracePath.toUriString()} -- ${e.message}"
179+
return
180+
}
175181

176182
// launch the agent
177183
writer = new Agent<PrintWriter>(traceFile)
@@ -186,12 +192,14 @@ class TraceFileObserver implements TraceObserverV2 {
186192
log.debug "Workflow completed -- saving trace file"
187193

188194
// wait for termination and flush the agent content
189-
writer.await()
195+
writer?.await()
190196

191197
// write the remaining records
192-
current.values().each { record -> traceFile.println(render(record)) }
193-
traceFile.flush()
194-
traceFile.close()
198+
if( traceFile ) {
199+
current.values().each { record -> traceFile.println(render(record)) }
200+
traceFile.flush()
201+
traceFile.close()
202+
}
195203
}
196204

197205
@Override
@@ -216,7 +224,7 @@ class TraceFileObserver implements TraceObserverV2 {
216224
current.remove(taskId)
217225

218226
// save to the file
219-
writer.send { PrintWriter it ->
227+
writer?.send { PrintWriter it ->
220228
it.println(render(event.trace))
221229
it.flush()
222230
}
@@ -230,7 +238,7 @@ class TraceFileObserver implements TraceObserverV2 {
230238
}
231239

232240
// save to the file
233-
writer.send { PrintWriter it ->
241+
writer?.send { PrintWriter it ->
234242
it.println(render(event.trace))
235243
it.flush()
236244
}

modules/nextflow/src/test/groovy/nextflow/trace/TraceFileObserverTest.groovy

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,49 @@ class TraceFileObserverTest extends Specification {
240240

241241
}
242242

243+
def 'should degrade gracefully when trace file already exists'() {
244+
245+
given:
246+
def testFolder = Files.createTempDirectory('trace-dir')
247+
def file = testFolder.resolve('trace')
248+
file.text = 'existing content' // pre-create the file so newFileWriter fails
249+
250+
// the handler
251+
def task = new TaskRun(id:TaskId.of(1), name:'test_task', hash: CacheHelper.hasher(1).hash(), config: new TaskConfig())
252+
task.processor = Mock(TaskProcessor)
253+
task.processor.getSession() >> new Session()
254+
task.processor.getName() >> 'x'
255+
task.processor.getExecutor() >> Mock(Executor)
256+
task.processor.getProcessEnvironment() >> [:]
257+
258+
def handler = new NopeTaskHandler(task)
259+
handler.status = TaskStatus.COMPLETED
260+
261+
// observer with overwrite=false (the default)
262+
def config = new TraceConfig(file: file.toString())
263+
def observer = new TraceFileObserver(config)
264+
265+
when: 'onFlowCreate fails to create the file'
266+
observer.onFlowCreate(null)
267+
then: 'writer and traceFile remain null'
268+
observer.@writer == null
269+
observer.@traceFile == null
270+
271+
when: 'task events and flow completion should not throw NPE'
272+
observer.onTaskSubmit( new TaskEvent(handler, handler.getTraceRecord()) )
273+
observer.onTaskComplete( new TaskEvent(handler, handler.getTraceRecord()) )
274+
observer.onTaskCached( new TaskEvent(handler, handler.getTraceRecord()) )
275+
observer.onFlowComplete()
276+
then:
277+
noExceptionThrown()
278+
279+
and: 'the original file content is unchanged'
280+
file.text == 'existing content'
281+
282+
cleanup:
283+
testFolder.deleteDir()
284+
}
285+
243286
def 'should create a record in the trace file'() {
244287

245288
given:

0 commit comments

Comments
 (0)