Question:
Program that issues GET QUEUE will occasionally get 4407 error-status. However, in the CV log we see deadlock messages that correspond to this request. Why does the program get 4407 when it gets deadlock? We expect xx29 for deadlock victim program.
Answer:
Unlike other database DML requests, application programs do not directly access records in the DDLDCRUN area. GET/PUT/DELETE QUEUE commands are passed to the QUEUE manager which uses a System Rununit (program RHDCRUAL) to access the records in DDLDCRUN that comprise a QUEUE.
Currently the MESSAGES and CODES manual contains the following explanation for 4407:
DELETE QUEUE
GET QUEUE
PUT QUEUE
An I/O error occurred during processing.
For a PUT QUEUE operation, this minor code can also mean that the queue upper limit has been reached.
In fact there are multiple reasons why 4407 may be returned. RHDCRUAL could receive several different error-status codes that will result in the application program receiving 4407.
The CV log should be checked to find the exact reason for the 4407. Deadlocks and area space exhausted in DDLDCRUN are the most common reasons for 4407.
Typically there will be a series of DC076nnn messages to describe database errors received by RHDCRUAL.
EXAMPLE:
DC076010 V50 T1042 Program.....: RHDCRUAL DC076011 V50 T1042 Subschema...: IDMSNWK7 DC076013 V50 T1042 Dbname......: SYSTEM
DC076014 V50 T1042 Error Status: 0229
DC076015 V50 T1042 Last DBkey..: 0000C272
DC076016 V50 T1042 Direct DBkey: 00C27201 DC076018 V50 T1042 Last Area...: DDLDCRUN
If a deadlock is responsible there will also be the standard deadlock messages (DC001000 and DC001002) preceding the DC076nnn messages.