|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 6187 (0x182b)
Types: TextFile
Names: »B«
└─⟦5f3412b64⟧ Bits:30000745 8mm tape, Rational 1000, ENVIRONMENT 12_6_5 TOOLS
└─⟦91c658230⟧ »DATA«
└─⟦458657fb6⟧
└─⟦274c33adf⟧
└─⟦d10a02448⟧ Bits:30000409 8mm tape, Rational 1000, ENVIRONMENT, D_12_7_3
└─⟦fc9b38f02⟧ »DATA«
└─⟦9b46a407a⟧
└─⟦274c33adf⟧
└─⟦this⟧
with Io;
with Daemon;
with Program;
with Error_Reporting;
with Debug_Tools;
with Disk_Daemon;
with Time_Utilities;
use Time_Utilities;
procedure Initialize_Daemons is
function "=" (L, R : Disk_Daemon.Threshold_Kinds) return Boolean
renames Disk_Daemon."=";
subtype Volume_Number is Disk_Daemon.Volume_Number;
subtype Bytes is Natural;
Kbyte : constant Bytes := 1024;
Mbyte : constant Bytes := 1024 * 1024;
subtype Threshold is Disk_Daemon.Percentage; -- eg, 10 means 10%
subtype Threshold_Kinds is Disk_Daemon.Threshold_Kinds;
type Threshold_Array is array (Threshold_Kinds) of Threshold;
function Min (Volume : Volume_Number) return Bytes is
begin
if Volume = 1 then
return (10 + 25) * Mbyte;
else
return 10 * Mbyte;
end if;
-- A Suspend threshold corresponding to 1 block is clearly worthless,
-- regardless of the size of the disk. Thus, you would expect there
-- to be some minimum absolute number of disk blocks to be included in
-- the suspend threshold. Assuming you recover from hitting the
-- suspend threshold by rebooting and elaborating just DDC, the
-- minimum needs to be higher than 10 Mbytes. You need to account for
-- swap space for the environment on volume 1.
end Min;
function New_Garbage (Consumed : Bytes) return Bytes is
begin
return (2 * Consumed) / 100; -- 2% of Consumed
-- GC has some tables whose size is a linear function of capacity. GC
-- produces new garbage while it is collecting the old garbage. The
-- amount of the new garbage is a linear function of capacity. We
-- assume that GC will produce 2% new garbage for the garbage that it
-- reclaims.
end New_Garbage;
function Suspend (Volume : Volume_Number;
Capacity : Bytes) return Bytes is
Fixed : constant Bytes := Min (Volume);
Variable : constant Bytes := 2 * New_Garbage (Capacity);
begin
return Fixed + Variable;
-- Assuming all of Capacity is garbage is clearly pessimistic. We
-- leave twice as much space as should be required because (1) failure
-- to leave enough space results in a restore from backup, and (2) the
-- procedure for recovering from hitting Suspend is very unfriendly
-- causing people to end up trying it 2 or 3 times, each wasted
-- attempt producing more garbage.
end Suspend;
function Get_Threshold (Kind : Threshold_Kinds;
Volume : Volume_Number;
Capacity : Bytes) return Bytes is
begin
if Kind = Disk_Daemon.Suspend_System then
return Suspend (Volume, Capacity);
else
declare
Next_Kind : constant Threshold_Kinds :=
Threshold_Kinds'Succ (Kind);
Next_Amount : constant Bytes :=
Get_Threshold (Next_Kind, Volume, Capacity);
Headroom : constant Bytes := Capacity - Next_Amount;
begin
return Next_Amount + New_Garbage (Headroom);
-- We assume that the headroom is ALL garbage when GC starts,
-- which is clearly pessimistic. The formula leaves enough
-- space for a complete GC cycle started AFTER the threshold
-- is reached.
end;
end if;
end Get_Threshold;
function To_Percent (Value : Bytes;
Capacity : Bytes) return Threshold is
begin
return Threshold ((Value * 100) / Capacity);
end To_Percent;
procedure Set (Volume : Volume_Number;
Capacity : Bytes) is
Thresholds : Threshold_Array;
Next_Threshold : Threshold := 0;
begin
-- Compute theoretical Thresholds
for K in Thresholds'Range loop
Thresholds (K) :=
To_Percent (Get_Threshold (K, Volume, Capacity), Capacity);
end loop;
-- Adjust for at least a 1% difference between thresholds
for K in reverse Thresholds'Range loop
if Next_Threshold >= Thresholds (K) then
Thresholds (K) := Next_Threshold + 1;
end if;
Next_Threshold := Thresholds (K);
end loop;
-- Preset thresholds to known, legal values
for K in reverse Thresholds'Range loop
Disk_Daemon.Set_Threshold
(Volume, K, 1 + Threshold_Kinds'Pos (Threshold_Kinds'Last) -
Threshold_Kinds'Pos (K));
end loop;
for K in Thresholds'Range loop
Disk_Daemon.Set_Threshold (Volume, K, Thresholds (K));
end loop;
end Set;
begin
-- Set Disk Daemon thresholds based on disk capacities
for Vol in 1 .. 4 loop
if Disk_Daemon.Exists (Vol) then
Set (Vol, Disk_Daemon.Capacity (Vol) * Kbyte);
end if;
end loop;
-- Snapshot parameters
Daemon.Snapshot_Warning_Message (20.0);
Daemon.Snapshot_Start_Message (False);
Daemon.Schedule ("Snapshot", 30 * Minute, 15 * Minute);
-- note that daemons are scheduled by default
Daemon.Set_Access_List_Compaction;
begin
Program.Run_Job
(S => Program.Current
(Subsystem => "!Commands.System_Maintenance",
Unit => "Smooth_Snapshots",
Parameters => "",
Activity => "!Machine.Release.Current.Activity"),
Debug => False,
Context => "$",
After => 0.0,
Options => "Name => (Smooth Snapshots)",
Response => "<PROFILE>");
exception
when others =>
Error_Reporting.Report_Error
(Caller => "!Machine.Initialize_Daemons.Smooth_Snapshots",
Reason => Error_Reporting.Create_Condition_Name
("Unhandled_Exception", Error_Reporting.Problem),
Explanation => Debug_Tools.Get_Exception_Name (True, True));
end;
end Initialize_Daemons;