HP OpenVMS Systemsask the wizard |
The Question is:
Sorry if this isn't an appropriate question.
Below is a piece of macro code inside my tcp_client.mar source. I am
running the Compaq TCPIP version 5.0a
When I run this (I have watched in debug), if the process on the other end
of the socket stops responding, my qio never times out. Eventually, with a
detached process, the process will use all of the resources and the system
hangs. Just for reference, t
his is not a problem caused by this version of VMS or TCPIP, since we have
had the problem for a few years now with older versions of VMS and
Wollengong Pathways as our TCP product. We just finally have time to look
at it.
Obviously, if it's taken this long to get to, it's not a mission critical
item. We just have very careful procedures for starting and stopping these
processes.
I wanted to change the qiow_s to just a qio_s, and add a setimr and wflor
call. However, I'm having problems getting these to work, and my manuals
don't have an example of these calls so that I can be sure I have good
parameter values and placement.
The easy answer would be to give me a link to the on line macro manual that
would have these. However, if you wanted to suggest a better way of solving
my 'hang' problem that would work too. My business constraint is that the
tcpip routines have to be i
n macro, and the applications staff is not going to change the calls, so I
can't add any parameters going in and out of the macro routines.
Here's the code piece, and thanks in advance for your time.
Maggie Waters
System Admin.
Express Scripts St. Louis MO
Silver Support routing code 1755
ST. LOUIS GS140 ALPHA
Software Access # 1151057
READ_NET:
$QIOW_S FUNC=#IO$_READVBLK,- ;
CHAN=CHAN,- ;
IOSB=IOSB,- ;
P1=(R9), - ; R9 points to input buffer
P2=R10 ; R10 is length of buffer
BLBS R0,10$ ; do we have a calling error
BRW 99$
10$: MOVZWL IOSB,R0 ; do we have an IO problem
BLBS R0,20$
BRW 99$
20$:
MOVZWL IOSB_CHAR_CNT,(R6) ; pass buffer length to caller
99$: RET ; RETURN to caller
The Answer is :
Since TCP/IP is a "connectionless" protocol, if an I/O operation is
already pending at the time the intended recipient starts ignoring
requests, the sender will have no way of detecting the condition and
the I/O will remain pending indefinitely.
>Eventually, with a detached process, the process will use all of the
>resources and the system hangs.
The first suggestion would be to impose appropriate quota limits on the
process to prevent it from consuming resources to the point of a system
hang. Usually it's better to have the process terminate with an EXQUOTA
of some type than lose the whole system!
Second suggestion - to implement a timeout on a $QIO for a device which
doesn't implement the IO$V_TIMED function modifier, use "crossed ASTs".
Something like:
$SETIMR(daytim=timeout,reqidt=uniqueID,astadr=CancelIO,astprm=ipchan)
$QIOW(chan=ipchan,...astadr=CancelTimer,astprm=uniqueID)
Where the AST routines are
routine CancelIO(p1)
$CANCEL(chan=p1)
end
routine CancelTimer(p1)
$CANTIM(reqidt=p1)
end
Notice that we're still using a $QIOW, so there's no need to mess with
$WFLOR. If the timer expires first, routine CancelIO will kill the I/O
operation and the $QIOW will terminate with a status of SS$_CANCEL or
SS$_ABORT depending on the exact state of the I/O at the time. If the
I/O completes first, the CanclTimer AST will fire, cancelling the
timer. Since we're using ASTs, they are automatically synchronized.
|