Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import nextflow.util.MemoryUnit

/**
* Models disk resource request
*
*
* @author Ben Sherman <[email protected]>
*/
@ToString(includeNames = true, includePackage = false)
Expand All @@ -33,30 +33,34 @@ class DiskResource {

final MemoryUnit request
final String type
final Boolean fusion

DiskResource( value ) {
DiskResource(value) {
this(request: value)
}

DiskResource( Map opts ) {
this.request = toMemoryUnit(opts.request)
DiskResource(Map opts) {
this.request = opts.request != null ? toMemoryUnit(opts.request) : null

if( opts.type )
if (opts.type)
this.type = opts.type as String

if (opts.fusion != null)
this.fusion = opts.fusion as Boolean
}

DiskResource withRequest(MemoryUnit value) {
return new DiskResource(request: value, type: this.type)
return new DiskResource(request: value, type: this.type, fusion: this.fusion)
}

private static MemoryUnit toMemoryUnit( value ) {
if( value instanceof MemoryUnit )
return (MemoryUnit)value
private static MemoryUnit toMemoryUnit(value) {
if (value instanceof MemoryUnit)
return (MemoryUnit) value

try {
return new MemoryUnit(value.toString().trim())
}
catch( Exception e ) {
catch (Exception e) {
throw new IllegalArgumentException("Not a valid disk value: $value")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,14 @@ trait FusionAwareTask {

boolean fusionEnabled() {
if( fusionEnabled==null ) {
fusionEnabled = getExecutor0().isFusionEnabled()
// Check task-level disk.fusion setting first
def diskFusion = getTask().config?.getDiskResource()?.fusion
if( diskFusion != null ) {
fusionEnabled = diskFusion
} else {
// Fall back to executor-level setting
fusionEnabled = getExecutor0().isFusionEnabled()
}
}
return fusionEnabled
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,23 @@ class DiskResourceTest extends Specification {
then:
disk.request == REQ
disk.type == TYPE
disk.fusion == FUSION

where:
VALUE | REQ | TYPE
_100_GB | _100_GB | null
[request: _100_GB] | _100_GB | null
[request: _375_GB, type: 'local-ssd'] | _375_GB | 'local-ssd'
VALUE | REQ | TYPE | FUSION
_100_GB | _100_GB | null | null
[request: _100_GB] | _100_GB | null | null
[request: _375_GB, type: 'local-ssd'] | _375_GB | 'local-ssd' | null
[request: _100_GB, fusion: true] | _100_GB | null | true
[request: _100_GB, fusion: false] | _100_GB | null | false
[request: _375_GB, type: 'local-ssd', fusion: false] | _375_GB | 'local-ssd' | false
}

def 'should return a disk resource with the specified request' () {
expect:
new DiskResource(request: _100_GB).withRequest(_375_GB) == new DiskResource(request: _375_GB)
new DiskResource(request: _100_GB, type: 'ssd').withRequest(_375_GB) == new DiskResource(request: _375_GB, type: 'ssd')
new DiskResource(request: _100_GB, fusion: true).withRequest(_375_GB) == new DiskResource(request: _375_GB, fusion: true)
new DiskResource(request: _100_GB, type: 'ssd', fusion: false).withRequest(_375_GB) == new DiskResource(request: _375_GB, type: 'ssd', fusion: false)
}
}