AmberDB
view release on metacpan or search on metacpan
lib/AmberDB/Base/Ramdisk.pm view on Meta::CPAN
if ( defined $tdir && length $tdir ) {
$tdir =~ s{^[\\/]+|[\\/]+$}{}g;
$target_dir = "$ramdisk_dir/$tdir";
}
else {
$target_dir = $ramdisk_dir;
}
$self->make_path($target_dir);
}
else {
$target_dir = $self->{_path}->{table_rdir} || $self->path('table_rdir') || "$ramdisk_dir/table";
}
my $target = "$target_dir/$tableid";
return $target . ( $with_ext ? ".$self->{db_ext}" : "" );
}
# Returns target ramdisk file path (.db for records, .inx for meta/indexes)
sub ramdisk_file_for {
my ( $self, $tableid, $key, $type ) = @_;
$tableid = $self->sanitize_table($tableid);
return unless defined $tableid && length $tableid;
my $base_path = $self->ramdisk_path($tableid) or return;
my $ext;
if ( defined $type && $type ne '' ) {
$ext = $type;
}
else {
my $table_info = $self->table_info($tableid);
my $is_simple = $self->config('simple') || ( $table_info && $table_info->{use_simple} );
if ( $is_simple || ( defined $key && $key =~ /^\d+$/ ) ) {
$ext = $self->{db_ext} // 'db';
}
else {
$ext = 'inx';
}
}
my $target = "${base_path}.${ext}";
return $target;
}
# Checks TTL expiration on ramdisk file.
# Strictly evaluated ONLY for Tier 3 (use_ramdisk => 3). Tiers 1 and 2 never expire.
# Unlinks expired file and returns 0.
sub _check_ramdisk_ttl {
my ( $self, $tableid, $file_path ) = @_;
return 1 unless -e $file_path;
my $table_info = $self->table_info($tableid);
my $use_ramdisk = $table_info ? ( $table_info->{use_ramdisk} // 0 ) : 0;
return 1 unless $use_ramdisk == 3;
my $ttl = $table_info ? ( $table_info->{ramdisk_ttl} // 300 ) : 300;
if ( defined $ttl && $ttl > 0 ) {
my $mtime = ( stat($file_path) )[9];
if ( defined $mtime && ( time() - $mtime ) > $ttl ) {
$self->table_close($file_path);
unlink $file_path;
return 0;
}
}
return 1;
}
my %RAMDISK_ENSURING;
# my $ramdisk_path = $adb->ramdisk_ensure($tableid);
# Ensures ramdisk for use_ramdisk => 1 or 2 is populated.
# Automatically triggers ramdisk_preload if files are absent.
# For Tier 3 (use_ramdisk => 3), checks TTL on RAM-disk .db without physical preloading.
# ------------------------------------------------
sub ramdisk_ensure {
my ( $self, $tableid ) = @_;
$tableid or return;
return unless $self->ramdisk_is_mounted();
return if $RAMDISK_ENSURING{$tableid};
my $table_info = $self->table_info($tableid);
my $use_ramdisk = $table_info ? ( $table_info->{use_ramdisk} // 0 ) : 0;
return unless $use_ramdisk;
$RAMDISK_ENSURING{$tableid} = 1;
my $ramdisk_path = $self->ramdisk_path($tableid);
unless ( $ramdisk_path ) {
delete $RAMDISK_ENSURING{$tableid};
return;
}
# For use_ramdisk == 3: volatile pure RAM table.
# Zero physical disk files, no preloading from physical disk!
if ( $use_ramdisk == 3 ) {
my $db_ext = $self->{db_ext} // 'db';
my $ram_db = "$ramdisk_path.$db_ext";
$self->_check_ramdisk_ttl( $tableid, $ram_db );
delete $RAMDISK_ENSURING{$tableid};
return $ramdisk_path;
}
my $table_path = $self->table_path($tableid);
my $needs_preload = 0;
# For use_ramdisk == 2 or 4: ensure .db is present in RAM-disk
# Note: Tiers 1, 2, and 4 do not expire via TTL as they are synchronized with physical disk.
if ( $use_ramdisk == 2 || $use_ramdisk == 4 ) {
my $db_ext = $self->{db_ext} // 'db';
my $src_db = "$table_path.$db_ext";
my $ram_db = "$ramdisk_path.$db_ext";
if ( -e $src_db && !-e $ram_db ) {
$needs_preload = 1;
}
}
# For use_ramdisk >= 1: ensure all secondary & lookup index files are present
( run in 1.081 second using v1.01-cache-2.11-cpan-cb04b646d8c )