root@ucbvax.UUCP (10/10/83)
From GEOFF5@SRI-CSL Mon Oct 10 01:52:06 1983
Here's how overdraft works:
(assume you start under your permanent quota)
You do a $PUT that requires that the file be extended. The ACP
checks and sees that you would exceed your permanent quota and
returns the error SS$_EXDISKQUOTA, but notes this fact in the
Window Control Block. The next time it is called it checks
against permanent+overdraft because the overdraft flag is set
for that file. In the "gray area" it returns the alternate
success code SS$_OVRDSKQUOTA. RMS does NOT return this to the
user (the $PUT returns RMS$_NORMAL; STV contains the 2nd longword
of the IOSB).
How to use it:
If a $PUT fails with STS'STV = RMS$_EXT'SS$_EXDISKQUOTA retry the
$PUT. If it succeeds you are now in the "gray area" (if not you
are past the overdraft).
High-level language experiment:
(I don't program in DEC PASCAL for "religious reasons" but I
understand that there is a PAS$RAB function that lets you play
similar games, which are left as an exercise to the reader.)
Program OverDraft
C Attempt to utilize disk overdraft from FORTRASH
Integer*4 I
Open (Unit=21,File='OUTFILE',CarriageControl='LIST',
* Status='NEW')
Do 20 I=1,999
10 Format (I4,' The quick brown fox jumps over the lazy dog
*''s back')
Write (21,10,Err=25) I
20 Continue
Stop
C For some reason a WRITE has failed!
25 Call Check(%Val(For$RAB(21)),I)
Go To 20
End
C This is what I have to put up with in a language that
C doesn't have pointers...at least it doesn't type check
Subroutine Check(RAB,I)
Integer*4 RAB(0:*),I,Sys$Put
50 Format (' I=',I4,' STS=',Z8.8,' STV=',Z8.8)
Type 50,I,RAB(2),RAB(3)
If (.Not.Sys$Put(RAB)) Then
60 Format (' Retry: STS=',Z8.8,' STV=',Z8.8)
Type 60,RAB(2),RAB(3)
Stop
End If
End
Observations:
Something trashes STS'STV before CHECK gets called. Other than
that it seems to work.
Conclusions:
You can't easily take advantage of overdrafts from high level
languages. DEC should provide better support at the RMS level.
-=EPS=-
------root@ucbvax.UUCP (10/11/83)
>From GEOFF5@SRI-CSL Tue Oct 11 00:28:02 1983
I implemented overdraft in FORTRAN much more simply. Without looking at
the status codes, I try operations that cause errors twice. If the
error can't be recovered (like exceeding the overdraft) you get one
useless try, but it handles the overdraft ok. It sure was a pain tho...
I had to do something similar in a training system as part of power
failure recovery. The recovery code was flawed & did not recover all
the time (thus the retry logic on errors).
--Mark (MHJohnson.F-15 @ HI-Multics)