From: scheible@SATURN.GSI.WTZA-BERLIN.DE (manfred scheible)
Newsgroups: comp.os.vms
Subject: Problem with RMS Recovery Unit Journaling
Date: 2 Sep 92 13:35:31 GMT
Distribution: world
Organization: The Internet

In the following small program, I will demonstrate the occurance
of an error in RMS Journaling for VMS Version 5.4. I have told
my problem to DIGITAL Service Center. The answer was:

  .
  .
  .
  "The VMS V5.4 behavior is consistent with the idea of
  streams as 'accessors'".
  .
  .
  .
  "The application evidently was build around the VMS 5.1 behavior,
  but we beleave that behavior was corrected around 1987. The old
  behavior would mean that Stream B and Stream A were not independent
  accessesors".
  .
  .
  .
  "Engineering requests closure of this CLD".

This answer is true for $DELETE, but not for $PUT and $UPDATE.
There, a second stream can access a new record in the same recovery
unit.

Who has similar problems?

Please send replies to info-vax!


Manfred Scheible

mail: scheible@saturn.gsi.wtza-berlin.de
fax:  +49-30-60901-100


Example:

$!           RMSJNL should be licensed.
$
$  macro sys$input /obj=rmsjnl_err

        .TITLE  RMSJNL_ERR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Title:   A deleted record in a Recovery Unit is readable
;           in a second stream.
;
;  Product: RMSJNL V5.4-2
;
;
;  Sequence:
;
;  (1) SYS$START_RU
;  (2) SYS$GET      (Stream A) using primary key with rop = rlk
;  (3) SYS$DELETE   (Stream A)
;  (4) SYS$GET      (Stream B) using alternate key with rop = nlk
;  (5) SYS$END_RU
;
;  In step (4) I try to access a record deleted in step (3).
;  Step (4) finished unexpected with success. In VMS Version 5.1
;  I have never seen this behavior before. There are no documentation
;  hints about changes in behavior of RMS calls using RU Journaling.
;
;  after step (4) the status is
;  in VMS 5.1-x RMS$_RNF    (%RMS-E-RNF)
;  in VMS 5.4-2 RMS$_OK_RLK (%RMS-S-OK_RLK)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  MACROS  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Error check:

        .MACRO  CHECK,P1=0,?L1
        CMPL    R0,#RMS$_NORMAL
        BEQL    L1
        CMPL    R0,#SS$_NORMAL
        BEQL    L1
        MOVL    R0,COND1
        MOVL    P1,COND2
        $PUTMSG_S MSGVEC=VECTOR
L1:
        .ENDM

; Text output:

        .MACRO  WRITE STRING=<>,?STR,?SKIP
        JMP     SKIP
STR:    .ASCID  /STRING/
SKIP:   PUSHAL  STR
        CALLS   #1,G^LIB$PUT_OUTPUT
        .ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  DATA  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        .PSECT  DATA,LONG

RU_HANDLE: .LONG 0
TID:    .BLKB   16

IOSB:   .BLKB   8

VECTOR: .LONG   2
COND1:  .LONG   0
COND2:  .LONG   0

KEY0:   .ASCII  /BBBBBBBBBB/
KEY1:   .ASCII  /2222222222/
RECORD: .BLKB   20

        .ALIGN  LONG

FAB:    $FAB -
                FNM=<RMSJNL_ERR.DAT>,-       ;   File name
                ORG=IDX,-
                FAC=<DEL,GET,PUT,UPD>,-      ;   Complete access
                SHR=<DEL,GET,PUT,UPD,MSE>    ;   Complete sharing

RAB0:   $RAB -
                FAB=FAB,-                    ;   Associated FAB
                RAC=KEY,-                    ;   Key access
                ROP=<RLK>,-                  ;   Options
                KRF=0,-                      ;   Key offset
                KSZ=10,-                     ;   Key size
                KBF=KEY0,-                   ;   Key buffer
                USZ=20,-                     ;   Size of user buffer
                UBF=RECORD                   ;   User buffer

RAB1:   $RAB -
                FAB=FAB,-                    ;   Associated FAB
                RAC=KEY,-                    ;   Key access
                ROP=<NLK>,-                  ;   Options
                KRF=1,-                      ;   Key offset
                KSZ=10,-                     ;   Key size
                KBF=KEY1,-                   ;   Key buffer
                USZ=20,-                     ;   Size of user buffer
                UBF=RECORD                   ;   User buffer

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;  CODE  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        .PSECT  CODE,NOWRT,LONG

        .ENTRY  RMSJNL_ERR,0

;;;  INIT  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        WRITE   <*** $OPEN>
        $OPEN   FAB=FAB
        CHECK   FAB+FAB$L_STV

        WRITE   <*** $CONNECT stream A>
        $CONNECT RAB=RAB0
        CHECK   RAB0+RAB$L_STV

        WRITE   <*** $CONNECT stream B>
        $CONNECT RAB=RAB1
        CHECK   RAB1+RAB$L_STV

;;;  TEST  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        WRITE   <*** $START_RU>                 ;
        $START_RU_S RU_HANDLE=RU_HANDLE         ; (1)
        CHECK                                   ;

;;;     WRITE   <*** $START_TRANSW>
;;;     $START_TRANSW_S IOSB=IOSB,TID=TID
;;;     CHECK

        WRITE   <*** $GET using key 0>          ;
        $GET    RAB=RAB0                        ; (2)
        CHECK   RAB0+RAB$L_STV                  ;

        WRITE   <*** $DELETE>                   ;
        $DELETE RAB=RAB0                        ; (3)
        CHECK   RAB0+RAB$L_STV                  ;

        WRITE   <*** $GET using key 1>          ;
        $GET    RAB=RAB1                        ; (4)
        CHECK   RAB1+RAB$L_STV                  ;

        WRITE   <*** $ABORT_RU>                 ;
        $ABORT_RU_S RU_HANDLE=RU_HANDLE         ; (5)

;;;     WRITE   <*** $ABORT_TRANSW>
;;;     $ABORT_TRANSW_S IOSB=IOSB,TID=TID

;;;  FINISH  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        WRITE   <*** $CLOSE>
        $CLOSE  FAB=FAB
        CHECK   FAB+FAB$L_STV

        RET

        .END    RMSJNL_ERR
$  link rmsjnl_err
$
$  create /fdl=sys$input

FILE
        NAME                    RMSJNL_ERR.DAT
        ORGANIZATION            indexed

RECORD
        FORMAT                  fixed
        SIZE                    20

KEY 0
        TYPE                    string
        SEG0_LENGTH             10
        SEG0_POSITION           0

KEY 1
        TYPE                    string
        DUPLICATES              yes
        CHANGES                 yes
        SEG0_LENGTH             10
        SEG0_POSITION           10
$
$  open /read /write fff RMSJNL_ERR.DAT
$  write fff "AAAAAAAAAA1111111111"
$  write fff "BBBBBBBBBB2222222222"
$  write fff "CCCCCCCCCC3333333333"
$  close fff
$
$  set file RMSJNL_ERR.DAT /ru_jour


Xref: sparky comp.os.vms:14172 vmsnet.sources.d:557 vmsnet.admin:410