| Title: | ACMSxp product questions and comments | 
| Notice: | Refer to notes 1 through 11 for conference information | 
| Moderator: | DUCAT::ROSCOE | 
| Created: | Tue Oct 05 1993 | 
| Last Modified: | Thu Jun 05 1997 | 
| Last Successful Update: | Fri Jun 06 1997 | 
| Number of topics: | 282 | 
| Total number of notes: | 1134 | 
Hello, I got a 'complaint' from a programmer that STDL compiling is taking so long. E.g. on an Alpha 2100 4/275 (OpenVMS V6.2-1H2) it takes about an hour to generate about 300 tasks. The STDL files themselves are about 720 blocks total in size. Is there any way of speeding up the compiling? I couldn't think of a way, but maybe someone has an idea? Cheers, Willem
| T.R | Title | User | Personal Name | Date | Lines | 
|---|---|---|---|---|---|
| 267.1 | sounds like some customer training is needed | CAMINO::ROSCOE | Tue Mar 25 1997 21:18 | 51 | |
|     Before, I start in on what can be done I should let you know that I've
    already answered this question from ECT.   ECT asked the same question
    through VX8000 and I responded to them, on March 17th.  I guess they
    have not yet received the information, so I'll state it again.
    I would also suggest that ECT receive some training on developing 
    ACMSxp applications.  Please ask the customer if they have received 
    such training.  Training is available if they are willing to pay for it.  
    
    I consider it a bad design to have all 300 tasks in one task 
    server.  Tasks should be grouped according to business functions.
    ACMSxp has a feature called task-call-task.  This implies that a 
    task can call a task in the same or different task groups.
    If the task is in different task group that implies you are 
    calling another task server.  This feature of ACMSxp is not
    present in ACMS.   Perhaps they are not aware of this feature.
    In addition the documentation does a decent job of explaining 
    design decisions.
    
    Assuming they must have all 300 tasks in the same task group
    there are several things they can do.
    
    1.  Make sure the file sys$startup:decc$startup.com is run during
        system startup.  Make sure that the account that is doing the 
        compiling has sufficient quotas.  For example are large working 
        set.
    
    2.  Compile the task group specification file separately
        from the STDL code that implements the individual tasks.
        If they are not adding or deleting tasks, or changing 
        task aruguments they do not need to recompile the task
        group specification file.  They are probably recompiling 
        the task group specification more than they need to.
    
    3.  Compile the task code definitions with the /task_only switch.
        This implies that all referenced task and processing group 
        definitions must be compiled separately.
    
    4.  Break the task code definitions up into individual STDL source
        code modules, or at least group them into smaller units.  Use
        MMS to decide which source code modules must be recompiled.
    
    5.  When they are just trying to get the STDL syntax to compile 
        have them compile with the /syntax_only switch.  Using this
        switch will just check the syntax but not actually cause any
        output files to be produced.
    
    If they implement these suggestions they should be able to cut the 
    compile time significantly.
    
    Rich
 | |||||
| 267.2 | What version of ACMSxp are they using? | CAMINO::ROSCOE | Tue Mar 25 1997 21:21 | 1 | |
| 267.3 | UTRTSC::WDEBAKKER | Feed your head | Wed Mar 26 1997 02:49 | 11 | |
| Thanks for your reply. I've forwarded your suggestions to them. So I didn't even have to mention the name of the customer... (you were right, it's ECT) They're using ACMSxp 2.2 and DCE 1.3B Did they ask you also about a performanceproblem when repeating functions (memoryleak-like symptoms) ? The problem does not occur when the Processing Server is a Dummy. Willem | |||||
| 267.4 | DUCAT::ROSCOE | Wed Mar 26 1997 09:29 | 18 | ||
| >>>Did they ask you also about a performance problem when >>>repeating functions (memoryleak-like symptoms) ? No, I've not heard of this. >>>The problem does not occur when the Processing Server >>>is a Dummy. If this means that they call the processing procedure and it does nothing but return, this implies that the problem is almost certainly with the code they wrote in the "real" processing procedure. Given that version 3.0 of ACMSxp on AlphaVMS has been out for a while can they upgrade to that version? It would be easier to support them on that version and they would be able to take advantage of several new features as well as better performance. rich | |||||
| 267.5 | UTRTSC::WDEBAKKER | Feed your head | Wed Apr 02 1997 04:32 | 298 | |
|     
    
    Well, this is the code they're using:
    
    
    
    /*         DB_T_GETDELINSCNB.C
    /*
    /*----------------------------------------------------------------
    */
    
    #include "n_src:vms_types.h"
    #include "n_src:include.h"
    #include <eclass.h>
    #include <einfo.h>
    #include "n_src:grp_civ_pilot.h"
    
    static char *ModuleName   = "DB_T_GETDELINSCNB";
    static char *SoortFunctie = "select";
    static long TransactionModeTest = TR_Write;
    
    static struct wrk_dbkey *      PODbKey;
    static struct wrk_primkey *    POPrimKey;
    struct wrk_aantalrec UAantal;
    /*
    ________________________________________________________________________________
    
    */ 
    static
    int UitvoerenTest(long ITransAantal)
    {
      int Status = FAE0101_SUCCES;
      char ErrorTxt[128];
    
      struct wrk_primkey  LPrimKey;
      struct wrk_cnb      LCNBRec;
      struct wrk_dbkey    LCNBKey;
      struct wrk_recpresent        LRecordPresent;
    
      static char *FunctionName;
    
      LRecordPresent.recordpresent = True;
    
      LPrimKey.cnbnr = POPrimKey[0].cnbnr;
    
      FunctionName = "TstGetDelInsCNB";
      mta01_getdelinscnb (&LPrimKey
                  ,&LCNBRec
                  ,&LCNBKey
                 ,&LRecordPresent
                  );
      if (einfo.eclass) {
        Status = FAE0101_TASK_EXCEPTION;
        sprintf( ErrorTxt, "Class = %d, Error code = %d\n", einfo.eclass,
    einfo.ecod
    e );
        LogSysError(ModuleName,FunctionName,Status,ErrorTxt);
      }
    /* 
        FunctionName = "TstDelCNB";
    
        mta01_delcnb (&LCNBKey
        );
        if (einfo.eclass) {
          Status = FAE0101_TASK_EXCEPTION;
          sprintf( ErrorTxt, "Class = %d, Error code = %d\n", einfo.eclass,
    einfo.ec
    ode );
          LogSysError(ModuleName,FunctionName,Status,ErrorTxt);
        }
        else {
          FunctionName = "TstInsCNB";
          mta01_inscnb (&LCNBRec
    
         ,&LCNBKey
          );
          if (einfo.eclass) {
     Status = FAE0101_TASK_EXCEPTION;
     sprintf( ErrorTxt, "Class = %d, Error code = %d\n", einfo.eclass,
    einfo.ecode )
    ;
     LogSysError(ModuleName,FunctionName,Status,ErrorTxt);
          }
        }
      }
    */
      return Status;
    }
    /*
    ________________________________________________________________________________
    _________________________
      InitTest
    ________________________________________________________________________________
    _________________________
    */ 
    static
    int InitTest()
    
    {
      int  Status = FAE0101_SUCCES;
      static char *FunctionName = "TstGetDelInsCNB";
    
      POPrimKey = NULL;
      PODbKey   = NULL;
      UAantal.aantal   = 200;
    
      if (NotStatusOk(Status)) {
        LogSysError(ModuleName,FunctionName,Status,"Aanroep van
    Settransaction");
      }
      else {  
        Status = MDB_LSTCNBNR(&POPrimKey
                               ,&PODbKey
                               ,&UAantal
                               );
    
        if (NotStatusOk(Status)) {
          LogSysError(ModuleName,FunctionName,Status,"MDB_LSTCNBNR");
        }
      }
    
      if (UAantal.aantal < 1) {
        printf("Geen gegevens om de test uit te voeren");
        Status = FAE0101_NIET_VERWERKT;
      }
    
      return Status;
    }
    
    #include "n_src:Test_Acms_Main.c"
    
    =====================================
    
    /*----------------------------------------------------------------
    
    /*         DB_T_GETDELINSCNB.C
    /*
    /*----------------------------------------------------------------
    */
    
    #include "n_src:vms_types.h"
    #include "n_src:include.h"
    
    static char *ModuleName   = "DB_T_GETDELINSCNB";
    static char *SoortFunctie = "select";
    static long TransactionModeTest = TR_Write;
    
    static struct wrk_dbkey *      PODbKey;
    static struct wrk_primkey *    POPrimKey;
    static struct wrk_aantalrec     UAantal;
    /*
    
    */ 
    static
    int UitvoerenTest(long ITransAantal)
    {
      int Status = FAE0101_SUCCES;
    
      struct wrk_primkey  LPrimKey;
      struct wrk_cnb      LCNBRec;
      struct wrk_dbkey    LCNBKey;
      struct wrk_recpresent LRecordPresent;
    
      static char *FunctionName;
    
      LRecordPresent.recordpresent = True;
    
      LPrimKey.cnbnr = POPrimKey[0].cnbnr;
    
      FunctionName = "TstGetCNB";
      Status = MDB_GETCNB (LPrimKey
                            ,&LCNBRec
                            ,&LCNBKey
                            ,&LRecordPresent
    
                            );
      if (NotStatusOk(Status)) {
        LogSysError(ModuleName,FunctionName,Status,"Aanroep van
    TstGETCNB");
      }
      else {
     
        FunctionName = "TstDelCNB";
    
        Status = MDB_DELCNB (LCNBKey
                              );
        if (NotStatusOk(Status)) {
          LogSysError(ModuleName,FunctionName,Status,"Aanroep van
    TstDELCNB");
        }
        else {
          FunctionName = "TstInsCNB";
          Status = MDB_INSCNB (LCNBRec
                                ,&LCNBKey
                                );
          if (NotStatusOk(Status)) {
            LogSysError(ModuleName,FunctionName,Status,"Aanroep van
    TstINSCNB");
          }
        }
    
      }
      return Status;
    }
    /*
    
    */ 
    static
    int InitTest()
    {
      int  Status = FAE0101_SUCCES;
      static char *FunctionName = "TstGetDelInsCNB";
    
      POPrimKey = NULL;
      PODbKey   = NULL;
      UAantal.aantal = 200;
    
      if (NotStatusOk(Status)) {
        LogSysError(ModuleName,FunctionName,Status,"Aanroep van
    Settransaction");
      }
      else {  
        Status = MDB_LSTCNBNR(&POPrimKey
                               ,&PODbKey
                               ,&UAantal
                               );
    
        if (NotStatusOk(Status)) {
          LogSysError(ModuleName,FunctionName,Status,"MDB_LSTCNBNR");
    
        }
      }
    
      if (UAantal.aantal < 1) {
        printf("Geen gegevens om de test uit te voeren");
        Status = FAE0101_NIET_VERWERKT;
      }
    
      return Status;
    }
    
    #include "n_src:TestMain.c"
    
    ==================================================
    
    #CINCLUDE "wrk_dbkey.stdl"
    #CINCLUDE "wrk_primkey.stdl"
    #CINCLUDE "wrk_cnb.stdl"
    #CINCLUDE "wrk_recpresent.stdl"
    #CINCLUDE "wrk_aantalrec.stdl"
    #CINCLUDE "prc_civ_pilot.stdl"
    #CINCLUDE "grp_civ_pilot.stdl"
    
    
    TASK mta01_getdelinscnb
        WORKSPACES ARE
          wrk_primkey,
          wrk_cnb,
          wrk_dbkey,
          wrk_recpresent;
    
        TASK ARGUMENTS ARE
            wrk_primkey    passed as input,
            wrk_cnb        passed as output,
            wrk_dbkey      passed as output,
            wrk_recpresent passed as inout;
    
        BLOCK WITH TRANSACTION
            PROCESSING
                CALL PROCEDURE mps_getcnb
                IN prc_civ_pilot
                USING wrk_primkey,
                      wrk_cnb,
                      wrk_dbkey,
                      wrk_recpresent;
    
    
            PROCESSING
                CALL PROCEDURE mps_delcnb
                IN prc_civ_pilot
                USING  wrk_dbkey;
    
            PROCESSING
                CALL PROCEDURE mps_inscnb
                IN prc_civ_pilot
                USING wrk_cnb,
                      wrk_dbkey;
    
        END BLOCK
        ACTION IS
            EXIT TASK WITH COMMIT TRANSACTION;
        END ACTION
        EXCEPTION HANDLER IS 
            EXIT TASK WITH ROLLBACK TRANSACTION;
        END EXCEPTION;
    END TASK;
    
    
 | |||||
| 267.6 | escalation seems premature | CAMINO::ROSCOE | Wed Apr 02 1997 23:29 | 13 | |
|     I assume you posted this code because this is the code that is
    leaking memory?  I did look briefly through the code and nothing 
    jumped out at me.  Also some of the code used by the processing procedure
    was not included.  Since the customer has proven that the leak is being
    caused by their code (the processing procedure does not leak when a 
    dummy routine is called) I suggest that they systematically stub out 
    various part of their code until they find the leak.
    
    If the customer cannot find the leak perhaps local Digital 
    support personnel be contracted to help?  It seems premature to 
    escalate this to ACMSxp Engineering at this point don't you think?
    
    Rich 
 | |||||
| 267.7 | UTRTSC::WDEBAKKER | Feed your head | Thu Apr 03 1997 02:04 | 6 | |
|     
    Yes, thanks Rich.
    I agree it's too early to escalate, I thought I'd just drop
    the question. We'll investigate further.
    Cheers,
    Willem
 | |||||