Convert-Pheno
view release on metacpan or search on metacpan
lib/Convert/Pheno/HTTP/Jobs.pm view on Meta::CPAN
$maximum //= $MAX_CONCURRENT_JOBS;
die "Maximum concurrent jobs must be an integer from 1 to $maximum\n"
unless defined($value) && !ref($value) && "$value" =~ /\A[1-9][0-9]*\z/
&& $value <= $maximum;
return 0 + $value;
}
sub _metadata_lock {
my ($file, $mode) = @_;
# Lock a stable sibling, not the JSON inode replaced by atomic writes.
# Windows readers must not overlap replacement (including its backup gap).
# Keep this file in place: unlinking it could create two independent locks.
my $lockfile = path($file)->parent->child('.metadata.lock');
open my $lock, '>>', $lockfile
or die "Cannot open job metadata lock <$lockfile>: $!\n";
flock($lock, $mode)
or die "Cannot lock job metadata <$lockfile>: $!\n";
return $lock;
}
sub _write {
lib/Convert/Pheno/IO/Atomic.pm view on Meta::CPAN
my $mode = $stat[2] & 07777;
chmod $mode, $staged
or die "Could not preserve permissions for staged output <$staged>: $!\n";
}
}
return 1 if rename $staged, $target;
my $rename_error = $!;
# Windows cannot replace an existing path with rename(). Keep a recoverable
# backup until the fully written staged file has taken its place.
# The Windows replacement fallback is valid only for an existing regular
# file. Never move a directory or symbolic link out of the way.
if ( $^O eq 'MSWin32' && -f $target && !-l $target ) {
my $backup = create_staged_path($target);
unlink $backup
or die "Could not prepare backup path for <$target>: $!\n";
rename $target, $backup
or die "Could not preserve existing output <$target>: $!\n";
if ( rename $staged, $target ) {
warn "Could not remove output backup <$backup>: $!\n"
unless unlink $backup;
return 1;
}
my $replacement_error = $!;
rename $backup, $target
or die "Could not replace <$target> ($replacement_error) or restore it ($!)\n";
die "Could not replace output <$target>: $replacement_error\n";
}
die "Could not replace output <$target>: $rename_error\n";
}
sub write_atomically {
my ( $target, $writer ) = @_;
die "Atomic output writer must be a code reference\n"
( run in 0.724 second using v1.01-cache-2.11-cpan-3f962061493 )