/****************************************************************************
  module      : vkb92
  author      : JuergenA
  responsible : UweH
  special area: Servertaskhandling
  see also    :
  description : KB_server_task
 
    ========== licence begin  GPL
    Copyright (c) 2001-2004 SAP AG
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end
 
*****************************************************************************/
 
.tt 1 $SAP$LiveCache$VKB92$
.tt 3 $UweH$KB_server_task$2000-05-22$
 
Module  : KB_server_task
 
Define  :
 
        VAR
              k92LogWriterTaskId : tsp00_TaskId;
 
        PROCEDURE
              k92server_process (VAR ServerTrans : tgg00_TransContext);
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
        FROM
              SQLManager : VAK101;
 
        PROCEDURE
              a101_SQLMan_ContextDestruct (VAR p : tsp00_Addr);
 
      ------------------------------ 
 
        FROM
              KB_index_handling : VKB33;
 
        PROCEDURE
              k33p_create_index_participant (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_headmaster : VKB38;
 
        PROCEDURE
              k38st_autosave_start (VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_backup_tasks : VKB39;
 
        PROCEDURE
              k39run_backup_task (VAR mblock : tgg00_MessBlock;
                    in_region : boolean);
 
      ------------------------------ 
 
        FROM
              KB_transaction: VKB53;
 
        PROCEDURE
              k53server_drop_aux_files (VAR Trans : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              KB_Logging : VKB560;
 
        PROCEDURE
              kb560SavepointCoordinator (VAR Trans : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              Parallel_Join : VKB742;
 
        PROCEDURE
              k742Select (
                    VAR m : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              KB_sender_receiver : VKB90;
 
        PROCEDURE
              k90child_reply (VAR mblock : tgg00_MessBlock;
                    ServerIndex          : tsp00_Int2;
                    VAR ChildTrans       : tgg00_TransChild);
 
        PROCEDURE
              k90server_init (VAR Trans : tgg00_TransContext;
                    VAR ServerIndex     : tsp00_Int2;
                    VAR IsDynamic       : boolean);
 
        PROCEDURE
              k90sreceive_server (VAR mblock : tgg00_MessBlock;
                    ServerIndex    : tsp00_Int2;
                    bAlreadyIdle   : boolean;
                    VAR ChildTrans : tgg00_TransChild);
 
      ------------------------------ 
 
        FROM
              KB_LogReader_and_RedoTask : VKB921;
 
        PROCEDURE
              kb921RedoLogExecuteTask (VAR TransContext : tgg00_TransContext);
 
        PROCEDURE
              kb921RedoLogReadTask (VAR TransContext : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_1 : VBD01;
 
        PROCEDURE
              b01pverify_participant (
                    VAR t              : tgg00_TransContext;
                    VAR file_id        : tgg00_FileId;
                    is_cold            : boolean;
                    bWithExtendedCheck : boolean);
 
        PROCEDURE
              bd01StartCoordinator (
                    VAR t    : tgg00_TransContext;
                    MessType : tgg00_MessType);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_2 : VBD02;
 
        PROCEDURE
              b02find_leaf (VAR t : tgg00_TransContext;
                    VAR file_id   : tgg00_FileId;
                    VAR key       : tgg00_Lkey);
 
        PROCEDURE
              b02prefetch (VAR t : tgg00_TransContext;
                    VAR file_id  : tgg00_FileId;
                    pno          : tsp00_PageNo);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_4 : VBD04;
 
        PROCEDURE
              bd04OmsReadAheadParticipant (
                    VAR t      : tgg00_TransContext;
                    VAR FileId : tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              filesysteminterface_5 : VBD05;
 
        PROCEDURE
              bd05Prefetch (
                    VAR trans    : tgg00_TransContext;
                    VAR fileId   : tgg00_FileId;
                    blobPosition : tsp00_Int4);
 
      ------------------------------ 
 
        FROM
              Trace : VBD120;
 
        PROCEDURE
              b120InsertTrace (VAR t   : tgg00_TransContext;
                    trace_layer  : tgg00_Debug;
                    trace_object : tgg00_VtraceType;
                    body_len     : tsp00_Int2;
                    trace_body   : tgg11_VtraceBodyPtr);
 
      ------------------------------ 
 
        FROM
              task_temp_data_cache : VBD21;
 
        PROCEDURE
              b21init_temp_cache (pid  : tsp00_TaskId;
                    buffers            : tsp00_Int4;
                    alloc_monitor      : boolean;
                    is_control_session : boolean;
                    VAR temp_cache_ptr : tgg00_TempDataCachePtr;
                    VAR err            : tgg00_BasisError);
 
      ------------------------------ 
 
        FROM
              object_garbage_collection : VBD91;
 
        (* PTS 1113635 FF    *)
        PROCEDURE
              bd91MigrateObjFile (VAR Trans : tgg00_TransContext;
                    VAR ObjFileId           :tgg00_FileId);
 
      ------------------------------ 
 
        FROM
              Configuration_Parameter : VGG01;
 
        VAR
              g01vtrace : tgg00_VtraceState;
 
        PROCEDURE
              g01abort (msg_no : tsp00_Int4;
                    msg_label  : tsp00_C8;
                    msg_text   : tsp00_C24;
                    bad_value  : tsp00_Int4);
 
        FUNCTION
              g01kb_work_st_size : tsp00_Int4;
 
        FUNCTION
              g01kb_workbuf_size : tsp00_Int4;
 
        FUNCTION
              g01mb_data_size : tsp00_Int4;
 
        FUNCTION
              g01mb_qual_size : tsp00_Int4;
 
        FUNCTION
              g01mb_stack_size : tsp00_Int4;
 
        PROCEDURE
              g01mblock_init (VAR source_trans : tgg00_TransContext;
                    mess_type  : tgg00_MessType;
                    mess2_type : tgg00_MessType2;
                    VAR mblock : tgg00_MessBlock);
 
      ------------------------------ 
 
        FROM
              GG_cpp_auxiliary_functions : VGG06;
 
        PROCEDURE
              gg06BuildTaskSession (VAR Session : tgg91_SessionNo;
                    TaskType : tsp00_Uint1);
 
      ------------------------------ 
 
        FROM
              Regions_and_Longwaits : VGG08;
 
        VAR
              g08server : tsp00_RegionId;
 
      ------------------------------ 
 
        FROM
              KernelAdministration_Interface : VGG999;
 
        PROCEDURE
              gg999Offline (error : tgg00_BasisError);
 
        PROCEDURE
              gg999RestartStandbyServer (VAR trans : tgg00_TransContext);
 
        PROCEDURE
              gg999SynchronizeServer (VAR trans : tgg00_TransContext);
 
      ------------------------------ 
 
        FROM
              RTE-Extension-20 : VSP20;
 
        FUNCTION
              s20or4a (VAR str : tsp00_Buf; si : tsp00_Int4) : tsp00_Int4;
 
      ------------------------------ 
 
        FROM
              RTE_kernel : VEN101;
 
        PROCEDURE
              vmalloc (length : tsp00_Int4;
                    VAR p     : tsp00_ObjAddr;
                    VAR ok    : boolean);
 
        PROCEDURE
              vbegexcl (pid : tsp00_TaskId;
                    region : tsp00_RegionId);
 
        PROCEDURE
              vendexcl (pid : tsp00_TaskId;
                    region : tsp00_RegionId);
&       ifdef TRACE
 
      ------------------------------ 
 
        FROM
              Test_Procedures : VTA01;
 
        PROCEDURE
              t01messblock (debug : tgg00_Debug;
                    nam           : tsp00_Sname;
                    VAR m         : tgg00_MessBlock);
&       endif
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
        FUNCTION
              s20or4a;
 
              tsp00_MoveObj tsp00_Buf
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created : 1980-01-11
.sp
.cp 3
.sp
.cp 3
Release :      Date : 2000-09-13
.sp
***********************************************************
.sp
.cp 12
.fo
.oc _/1
Specification:
(* PTS 1104043 JA 1999-10-08 *)
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
 
 
CONST
      ALLOC_MONITOR   = true;
      CONTROL_SESSION = true;
      IN_REGION       = true;
 
 
(*------------------------------*) 
 
PROCEDURE
      k92server_process (VAR ServerTrans : tgg00_TransContext);
 
VAR
      AllocOk : boolean;
      mblock  : tgg00_MessBlock;
 
      UnivAddr : RECORD
            CASE integer OF
                1:
                    (uvObj       : tsp00_ObjAddr);
                2:
                    (uvDataPart  : tgg00_DataPartPtr);
                3:
                    (uvMoveObj   : tsp00_MoveObjPtr);
                4:
                    (uvQualBuf   : tgg00_QualBufPtr);
                5:
                    (uvStackList : tgg00_StackListPtr)
                END;
            (*ENDCASE*) 
 
 
BEGIN
g01mblock_init (ServerTrans, m_nil, mm_nil, mblock);
WITH mblock DO
    BEGIN
    mb_trns         := @ServerTrans;
    mb_data_size    := g01mb_data_size;
    mb_qual_size    := g01mb_qual_size;
    mb_st_size      := g01mb_stack_size;
    mb_st_max       := mb_st_size         DIV sizeof (tgg00_StackEntry);
    mb_work_st_max  := g01kb_work_st_size DIV sizeof (tgg00_StackEntry);
    mb_workbuf_size := g01kb_workbuf_size
    END;
(*ENDWITH*) 
vmalloc (mblock.mb_data_size, UnivAddr.uvObj, AllocOk);
IF  AllocOk
THEN
    BEGIN
    mblock.mb_data := UnivAddr.uvDataPart;
    (* *)
    vmalloc (mblock.mb_qual_size, UnivAddr.uvObj, AllocOk)
    END;
(*ENDIF*) 
IF  AllocOk
THEN
    BEGIN
    mblock.mb_qual := UnivAddr.uvQualBuf;
    (* *)
    vmalloc (mblock.mb_st_size, UnivAddr.uvObj, AllocOk)
    END;
(*ENDIF*) 
IF  AllocOk
THEN
    BEGIN
    mblock.mb_st := UnivAddr.uvStackList;
    (* *)
    vmalloc (g01kb_work_st_size, UnivAddr.uvObj, AllocOk)
    END;
(*ENDIF*) 
IF  AllocOk
THEN
    BEGIN
    mblock.mb_work_st := UnivAddr.uvStackList;
    (* *)
    vmalloc (mblock.mb_workbuf_size, UnivAddr.uvObj, AllocOk)
    END;
(*ENDIF*) 
IF  NOT AllocOk
THEN
    WITH mblock DO
        g01abort (kb92x1ServerProcess_csp03, csp3_n_server,
              'NO MORE MEMORY          ',
              mb_data_size
              + mb_qual_size
              + mb_st_size
              + mb_work_st_max * sizeof (tgg00_StackEntry)
              + mb_workbuf_size );
    (*ENDWITH*) 
(*ENDIF*) 
mblock.mb_workbuf := UnivAddr.uvMoveObj;
(* *)
b21init_temp_cache (mblock.mb_trns^.trTaskId_gg00,
      0, NOT ALLOC_MONITOR, NOT CONTROL_SESSION,
      mblock.mb_trns^.trBdTcachePtr_gg00,
      mblock.mb_trns^.trError_gg00);
(* *)
IF  mblock.mb_trns^.trError_gg00 = e_ok
THEN
    BEGIN
    (* *)
    gg06BuildTaskSession (mblock.mb_trns^.trSessionId_gg00, ord(sp2pt_server));
    ;
    (*-=-=-=-=-=-=-=-=-*)
    kb92_server (mblock);
    (*-=-=-=-=-=-=-=-=-*)
    END
(*ENDIF*) 
END;
 
(*------------------------------*) 
 
PROCEDURE
      kb92_server (VAR mblock : tgg00_MessBlock);
 
VAR
      bAlreadyIdle   : boolean;
      bDynamicServer : boolean;
      StartMessType  : tgg00_MessType;
      ServerIndex    : tsp00_Int2;
      ChildTrans     : tgg00_TransChild;
      ReceivedMhead  : tgg00_MessBufHeader;
      EnterTrace     : tgg11_KbEnterTrace;
      LeaveTrace     : tgg11_KbTrace;
 
BEGIN
mblock.mb_trns^.trError_gg00 := e_ok;
ServerIndex    := 0;
bDynamicServer := false;
vbegexcl       (mblock.mb_trns^.trTaskId_gg00, g08server);
k90server_init (mblock.mb_trns^, ServerIndex, bDynamicServer);
vendexcl       (mblock.mb_trns^.trTaskId_gg00, g08server);
bAlreadyIdle := NOT bDynamicServer;
WHILE true DO
    BEGIN
    StartMessType := m_nil;
    WITH mblock.mb_trns^ DO
        BEGIN
        trRteCommPtr_gg00^.to_cancel       := false; (* reset *)
        trRteCommPtr_gg00^.file_root       := NIL_PAGE_NO_GG00;
        trRteCommPtr_gg00^.file_record_cnt := 0;
        (* *)
        trIndex_gg00 := cgg_nil_transindex;
        trError_gg00 := e_ok
        END;
    (*ENDWITH*) 
    k90sreceive_server (mblock, ServerIndex, bAlreadyIdle, ChildTrans);
    IF  mblock.mb_trns^.trError_gg00 = e_ok
    THEN
        BEGIN
        WITH mblock DO
            BEGIN
            mb_trans_child^         := ChildTrans;
            mb_trns^.trWarning_gg00 := [ ];
            mb_trns^.trError_gg00   := e_ok;
            StartMessType           := mb_type
            END;
        (*ENDWITH*) 
        (* *)
        IF  mblock.mb_struct = mbs_stack_addr
        THEN
            BEGIN
            mblock.mb_qual^.mst_addr := mblock.mb_st;
            mblock.mb_qual^.mst_max  := mblock.mb_st_max
            END;
        (*ENDIF*) 
        ReceivedMhead := mblock.mb_header; (* save *)
        bAlreadyIdle  := false;
&       ifdef TRACE
        t01messblock (kb_net, 'RCV_SERVER  ', mblock);
&       endif
        IF  g01vtrace.vtrAll_gg00
        THEN
            BEGIN
            EnterTrace.kbMessType_gg11  := mblock.mb_type;
            EnterTrace.kbMessType2_gg11 := mblock.mb_type2;
            EnterTrace.kbSubtrans_gg11  := mblock.mb_trns^.trSubtransId_gg00;
            b120InsertTrace (mblock.mb_trns^, kb, vttKbServer_egg00, sizeof (EnterTrace), @EnterTrace)
            END;
        (*ENDIF*) 
        CASE mblock.mb_type OF
            m_autosave:
                CASE mblock.mb_type2 OF
                    mm_log:
                        k38st_autosave_start (mblock);
                    mm_participant:
                        k39run_backup_task (mblock, NOT IN_REGION);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_column:
                IF  mblock.mb_type2 =  mm_participant
                THEN
                    bd05Prefetch (mblock.mb_trns^, mblock.mb_qual^.mtree,
                          s20or4a (mblock.mb_data^.mbp_4kbuf, 1))
                ELSE
                    mblock.mb_trns^.trError_gg00 := e_not_implemented;
                (*ENDIF*) 
            m_create_index_parallel:
                CASE mblock.mb_type2 OF
                    mm_participant :
                        k33p_create_index_participant (mblock)
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_drop:
                BEGIN
                (* PTS 1104414 JA 1999-11-01 *)
                CASE mblock.mb_type2 OF
                    mm_parallel:
                        k53server_drop_aux_files (mblock.mb_trns^);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
                ;
                END;
            m_get:
                CASE mblock.mb_type2 OF
                    mm_read:
                        b02prefetch (mblock.mb_trns^, mblock.mb_qual^.mcfc_tree,
                              mblock.mb_qual^.mcfc_pno);
                    mm_pages:
                        b02find_leaf (mblock.mb_trns^, mblock.mb_qual^.mtree,
                              mblock.mb_data^.mbp_key);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_get_object:
                CASE mblock.mb_type2 OF
                    mm_coordinator:
                        bd01StartCoordinator (mblock.mb_trns^, mblock.mb_type);
                    mm_participant:
                        bd04OmsReadAheadParticipant (mblock.mb_trns^, mblock.mb_qual^.mtree);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            (* PTS 1113635 FF *)
            m_migrate_obj_files:
                bd91MigrateObjFile (mblock.mb_trns^, mblock.mb_qual^.mtree);
            m_restart:
                CASE mblock.mb_type2 OF
                    mm_nil:
                        kb921RedoLogExecuteTask (mblock.mb_trns^);
                    mm_standby:
                        gg999RestartStandbyServer(mblock.mb_trns^);
                    mm_consistent:
                        gg999SynchronizeServer (mblock.mb_trns^);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_restore:
                kb921RedoLogReadTask (mblock.mb_trns^);
            m_restore_parallel:
                CASE mblock.mb_type2 OF
                    mm_participant:
                        k39run_backup_task (mblock, NOT IN_REGION);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_save_parallel:
                CASE mblock.mb_type2 OF
                    mm_participant:
                        k39run_backup_task (mblock, NOT IN_REGION);
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            m_savepoint:
                kb560SavepointCoordinator (mblock.mb_trns^);
            m_select_row :
                k742Select (mblock);
            m_verify:
                CASE mblock.mb_type2 OF
                    mm_participant :
                        b01pverify_participant (mblock.mb_trns^, mblock.mb_qual^.mtree,
                              mblock.mb_qual^.buf[sizeof(tgg00_FileId)+1] = chr(ord(true)),
                              mblock.mb_qual^.buf[sizeof(tgg00_FileId)+2] = chr(ord(true)));
                    OTHERWISE
                        mblock.mb_trns^.trError_gg00 := e_not_implemented;
                    END;
                (*ENDCASE*) 
            OTHERWISE:
                mblock.mb_trns^.trError_gg00 := e_not_implemented;
            END;
        (*ENDCASE*) 
        ;
        (* PTS 1120019                                                               *)
        (* function based index operation may have created a SQLMan_Context instance *)
        (* this instance must be destroyed now                                       *)
        a101_SQLMan_ContextDestruct (mblock.mb_trns^.trAcvPtr_gg00);
        WITH mblock DO
            BEGIN
            IF  mb_trns^.trError_gg00 = e_not_implemented
            THEN
                BEGIN
                mb_type     := m_return_error;
                mb_type2    := mm_nil;
                mb_struct   := mbs_nil;
                mb_qual_len := 0;
                mb_data_len := 0
                END
            ELSE
                IF  mb_type <> m_return_result
                THEN
                    BEGIN
                    mb_type  := m_return_error;
                    mb_type2 := mm_nil
                    END;
                (*ENDIF*) 
            (*ENDIF*) 
            IF  g01vtrace.vtrAll_gg00
            THEN
                BEGIN
                LeaveTrace.kbMessType_gg11  := mb_type;
                LeaveTrace.kbMessType2_gg11 := mb_type2;
                LeaveTrace.kbError_gg11     := mb_trns^.trError_gg00;
                b120InsertTrace (mb_trns^, kb, vttKbServer_egg00, sizeof (LeaveTrace), @LeaveTrace)
                END;
            (*ENDIF*) 
            ;
            (* restore *)
            mb_reply              := ReceivedMhead.mb_reply;
            ChildTrans            := mb_trans_child^;
            mb_trns^.trError_gg00 := e_ok;  (*  error already assigned to ChildTrans *)
            END;
        (*ENDWITH*) 
&       ifdef TRACE
        t01messblock (kb_net, 'SERVER_REPLY', mblock);
&       endif
        k90child_reply (mblock, ServerIndex, ChildTrans)
        END
    ELSE
        (* message not received OR message incomplete *)
        IF  (mblock.mb_trns^.trError_gg00 = e_too_many_mb_stackentries) OR
            (mblock.mb_trns^.trError_gg00 = e_too_many_mb_data        ) OR
            (mblock.mb_trns^.trError_gg00 = e_too_small_mb_qual_part  ) OR
            (mblock.mb_trns^.trError_gg00 = e_illegal_server_mb       )
        THEN
            WITH mblock DO
                BEGIN
                mb_type               := m_return_error;
                mb_type2              := mm_nil;
                mb_struct             := mbs_nil;
                mb_qual_len           := 0;
                mb_data_len           := 0;
                mb_reply              := ReceivedMhead.mb_reply;
                ChildTrans            := mb_trans_child^;
                mb_trns^.trError_gg00 := e_ok; (* error already assigned to ChildTrans *)
                k90child_reply (mblock, ServerIndex, ChildTrans)
                END;
            (*ENDWITH*) 
        (*ENDIF*) 
    (*ENDIF*) 
    IF  mblock.mb_trns^.trError_gg00 <> e_ok
    THEN
        gg999Offline (mblock.mb_trns^.trError_gg00);
    (*ENDIF*) 
    END
(*ENDWHILE*) 
END;
 
.CM *-END-* code ----------------------------------------
.SP 2 
***********************************************************
.PA 
