Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Important MPS messages can arrive in bursts of about 200 per second!

  1. #Setup
    1. #Environment
    2. #Dependencies
    3. #Test inside Eclipse
  2. #Development
    1. #Overview
    2. #Launch Script
    3. #Classes and Functions
      1. #Message
      2. #Other
  3. #Release with Eclipse
    1. #Start/Stop
  4. #Troubleshoot#Starting and Stopping

Setup

Environment

  • Effectively, you can only develop MPS History Server inside Eclipse on lcls-builder.
  • Check out the CVS module physics/mps/mpshist into your workspace in the LCLS VLAN
    • From now on, the root of project is referred to as $MPSHIST_ROOT
  • Use ant to build the jars.
  • Stop the production version of mpshist and run the version in your workspace.
  • After you are done, remember to stop you version and run the production version

Dependencies

For library paths, see the build.xml file. Note that the dependent jar files are copied into the lib folder and are part of CVS. To update the jar files, run ant update_dependencies. This should copy the files from $PHYSICS_TOP on dev onto the lib folder. You can then commit these updated dependent jar files into CVS.

  • ezJCA (version R0-0-10)
  • javainterfaces (current version)
  • MPS Config
  • xal4lcls
    • ext.jar (current version)
    • xal.jar (current version)

Test

...

  • See the development section on how to run your own version of mpshist.
  • "Poke" MPS - note that the PV's mentioned here may not exist. Ask Sonya for some test PV's that can be used.

    Code Block
    caput POSI:EP02:400:MTLM_LGC_BYPV 1
    

    wait 10 seconds!

    Code Block
    caput POSI:EP02:400:MTLM_LGC_BYPV 0
    
  • Check the HistoryViewer tab on the MPS GUI
  • Stop MpsHistManager
  • Important: start the production server (see #Start / Stop
  • Select $MPSGUI_ROOT/src/edu.stanford.slac.mpshist/MpsHistManager
  • Right-click => select Run As... => Java Application
  • If you run the app for the first time, it should fail
    • Go to Run in the Window menu
    • Select "Open Run Dialog..."
    • Select "MpsHistManager" in the window on the left
    • Select the "Arguments" tab
    • Enter the following arguments:
      Code Block
      
      /usr/local/lcls/epics/iocTop/MachineProtection/mpsConfiguration/database/XYZ/mpsdb.sqlite3 password
      
      • XYZ - the current Config version (caget IOC:BSY0:MP01:DBVERS)
      • password - the current password (see also #Launch Script)
        in the "Program arguments" area.
    • Press "Run"
  • Note: to actually receive messages, you have to stop the production server (see #Starting and Stopping)

Development

Overview

Image RemovedImage Added

Launch Script

  • mpshist under $MPSHIST_ROOT
  • Gets the current version of the Config DB
    • Assembles the path to it
  • Sets up the CLASSPATHOracle Wallet
  • Runs MpsHistManager and tells the process to write all message into a log file

Classes and Functions

Message

edu.stanford.slac.

...

mpshist.

...

message.

...

  • Monitors current Macro state numbers from IOC:BSY0:MP01:TTBLST.VALA
  • Bypasses faults to a value for a time duration
  • Monitors bypassed faults and end times
  • Given a fault name, gets current state, type, and timestamp
    of the fault
  • Given a PV, gets beam rate names (MPS and actual)
  • Translates between EPICS and Java time
edu.stanford.slac.mps.jdbc.JDBCMonitor
  • Loads all data from Config/Logic DB
    • Config DB URL prefix: jdbc:sqlite:/usr/local/lcls/epics/iocTop/MachineProtection/mpsConfiguration/database/
    • Logic DB URL prefix: jdbc:sqlite:/usr/local/lcls/epics/iocTop/MachineProtection/mpsConfiguration/algorithm/
  • Checks periodically for new versions
    • Current Config DB version is stored in IOC:BSY0:MP01:DBVERS
    • Current Logic DB version is stored in IOC:BSY0:MP01:ALGRNAME
edu.stanford.slac.mps.jdbc.config.ConfigDB
  • Singleton
  • Serves as a facade to information about faults
  • SQL queries are in the file sqlite.properties in the package edu.stanford.slac.mps.jdbc.config
edu.stanford.slac.mps.jdbc.logic.LogicDB
  • Singleton
  • Serves as a facade to information about Macros (and states), ignore conditions, current MacroStates
  • SQL queries are in the file sqlite.properties in the package edu.stanford.slac.mps.jdbc.logic

Release with Eclipse

  • Add a note in $MPSGUI_ROOT/RELEASE_NOTES
    • Increment the tag version accordingly
  • Commit to CVS
  • Tag with mpsconfig-R#-#-#
  • Check out the tagged version into production
    Code Block
    
    cd $PHYSICS_TOP/release
    cvs co -r mpsconfig-R#-#-# -d mpsconfig-R#-#-# physics/mps/mpsconfig
    
  • Select File => New Java project => Create project from existing source
  • Select $PHYSICS_TOP/release/mpsconfig-R#-#-#
  • Name the project mpsconfig-R#-#-#
  • Press "Finish"
  • Right-click on the new project mpsconfig-R#-#-# => Export...
  • Select Java => JAR file
  • Check mpsconfig-R#-#-# in "Resources to export"
  • Check "Export generated class files and resources"
  • As the export destination, type (and/or select)
    Code Block
    
    $PHYSICS_TOP/release/mpsconfig-R#-#-#/jar/mpsconfig.jar
    
  • Press "Finish"
  • Move the symbolic link
    Code Block
    
    cd $PHYSICS_TOP/
    rm -rf mpsconfig; ln -s release/mpsconfig-R#-#-# mpsconfig
    
  • Launch MPS GUI from lclshome
    • MPS Global => MPS GUI...
    • MPS Global => MPS CUD...
      MPS History Server (mpshist) is a server application for saving MPS messages to Oracle.

Starting and Stopping

  • Only one MPS History Server is active at any time
  • To start a new server, you must login as laci on lcls-daemon2
    Code Block
    
    /etc/rc3.d/S99st.mpshist start
    
  • To stop a production server, type
    Code Block
    
    /etc/rc3.d/S99st.mpshist stop
    

#Programmer's Guide
#User's Guide
#References

Programmer's Guide

MPS Config

Oracle

JDBC Url
Code Block

jdbc:oracle:thin:MPS_HISTORY/%s@slac-oracle02.slac.stanford.edu:1521:SLACDEV
jdbc:oracle:thin:MPS_HISTORY/%s@slac-oracle04.slac.stanford.edu:1521:MCCQA

where %s = the current password.

Schema

Image Removed

Procedures
Code Block

BEGIN MPS_HISTORY.MPS_HISTORY_PKG.DML_%s1 (%s2); END;

where
%s1 = table name
%s2 = CSVs in the same order as in the #Schema (top-to-bottom = left-to-right); ignore the ID column; replace the FKs with enums from the referenced table.

Message Types
Message
  • Java representation of an MPS message
Code Block
///****************************************************************************
// * Data Pointers
// ****************************************************************************/
///* Note: The history message header begins at the first byte of TCP Data
// */
// 
//#define HISTORY_MESSAGE_HEADER_SECTION_POINTER(_pointerToFullMessage)      ((epicsInt8  *)(_pointerToFullMessage)   + 0)
//#define HISTORY_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToHistoryHeader)  ((epicsUInt8 *)(_pointerToHistoryHeader) + 0)
//#define HISTORY_MESSAGE_TYPE_POINTER(_pointerToHistoryHeader)              ((epicsUInt8 *)(_pointerToHistoryHeader) + 1)
//#define HISTORY_MESSAGE_DATA_SECTION_POINTER(_pointerToHistoryHeader)      ((epicsInt8  *)(_pointerToHistoryHeader) + 2)
//
//#define HISTORY_MESSAGE_PROTOCOL_VERSION(_pointerToHistoryHeader)          (*HISTORY_MESSAGE_PROTOCOL_VERSION_POINTER(_pointerToHistoryHeader))
//#define HISTORY_MESSAGE_TYPE(_pointerToHistoryHeader)                      (*HISTORY_MESSAGE_TYPE_POINTER(_pointerToHistoryHeader))
//
///****************************************************************************
// * Super Message
// ****************************************************************************/
///* All history message struct data.
// */
//
//
//
//#define HISTORY_SUPER_MESSAGE_SIZE                                           (16 + MPSHistoryProtocolHeaderSize)
//
//#define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToHistoryData)  ((epicsUInt32 *)((_pointerToHistoryData) +  0))
//#define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToHistoryData)  ((epicsUInt32 *)((_pointerToHistoryData) +  4))
//#define HISTORY_SUPER_TIMESLOT_POINTER(_pointerToHistoryData)                ((epicsUInt8  *)((_pointerToHistoryData) +  8))
//#define HISTORY_SUPER_TYPE_POINTER(_pointerToHistoryData)                    ((epicsUInt8  *)((_pointerToHistoryData) +  9))
//#define HISTORY_SUPER_ID_POINTER(_pointerToHistoryData)                      ((epicsUInt32 *)((_pointerToHistoryData) + 10))
//#define HISTORY_SUPER_OLD_VALUE_POINTER(_pointerToHistoryData)               ((epicsUInt32 *)((_pointerToHistoryData) + 14))
//#define HISTORY_SUPER_NEW_VALUE_POINTER(_pointerToHistoryData)               ((epicsUInt32 *)((_pointerToHistoryData) + 18))
//
Code Block
//#define HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH(_pointerToHistoryData)          (*HISTORY_SUPER_TIMESTAMP_SECPASTEPOCH_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID(_pointerToHistoryData)          (*HISTORY_SUPER_TIMESTAMP_NSEC_PULSEID_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_TIMESLOT(_pointerToHistoryData)                        (*HISTORY_SUPER_TIMESLOT_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_TYPE(_pointerToHistoryData)                            (*HISTORY_SUPER_TYPE_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_ID(_pointerToHistoryData)                              (*HISTORY_SUPER_ID_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_OLD_VALUE(_pointerToHistoryData)                       (*HISTORY_SUPER_OLD_VALUE_POINTER(_pointerToHistoryData))
//#define HISTORY_SUPER_NEW_VALUE(_pointerToHistoryData)                       (*HISTORY_SUPER_NEW_VALUE_POINTER(_pointerToHistoryData))
  • There are various message types that we display in human readable form
    • Beam destination: Beam destination changed from PREVIOUS DESTINATION_NAME to CURRENT DESTINATION_NAME
    • Beam rate: Beam rate rate after DEVICE_NAME changed from PREVIOUS RATE_NAME to CURRENT RATE_NAME
    • Fault: DEVICE_NAME FAULT_NAME changed from PREV_STATE to CURR_STATE
    • Bypass time: DEVICE_NAME FAULT_NAME is bypassed for BYPASS_TIME_IN_SECONDS sec OR DEVICE_NAME FAULT_NAME bypass had cleared
    • Bypass value: DEVICE_NAME FAULT_NAME changed from PREV_VALUE to CURR_VALUE

User's Guide

Scripts

Check nohup.out, /u1/lcls/tools/mpsHistoryServer/mpshist.log

You have to run mpshist on lcls-daemon2 as laci

edu.stanford.slac.mpshist.message.MessageRepository
  • A singleton that caches MPS messages before they are exported to Oracle

Other

edu.stanford.slac.mpshist.MessageCounter
  • A thread-safe way to count messages, both received and exported, and periodically put the numbers into cmlog
  • Primarily used for debugging
edu.stanford.slac.mpshist.MessageExporter
  • An instance of Runnable that periodically saves messages to the Oracle DB

Image Added

  • Eli wrote a PL/SQL procedure that hides (almost) all the details

    Code Block
    BEGIN MPS_HISTORY.MPS_HISTORY_PKG.DML_%s1 (%s2); END;
    
    • %s1 = table name
    • %s2 = CSVs in the same order as in the schema with following caveats:
      • top-to-bottom = left-to-right
      • ignore the ID column
      • replace the FKs with enums from the referenced table
edu.stanford.slac.mpshist.MessageServer
  • An instance of Runnable that caches messages from MPS in memory
  • Tries to create a ServerSocket bound to a port specified as an argument to the constructor
edu.stanford.slac.mpshist.MpsHistManager
edu.stanford.slac.mpshist.MpsHistProperties
  • Contains (almost) all parameters and settings for the module
    • Including the address of the MPS IOC that sends messages

      Code Block
      public static final InetSocketAddress SOCKET_ADDRESS = new InetSocketAddress("ioc-bsy0-mp01.slac.stanford.edu", 30000);
      
edu.stanford.slac.mpshist.ServerNotifier
  • A runnable that periodically notifies MPS about a running server
    • Sends out Datagram packets

Release

  • Add a note in $MPSHIST_ROOT/RELEASE_NOTES
    • Increment the tag version accordingly
  • Commit to CVS
  • Tag with mpshist-R#-#-#
  • Check out the tagged version on development into your workspace using eco and build using ant

    Code Block
    $ eco
    Enter name of module/package to checkout: mpshist
    Enter name of tag or [RETURN] to use HEAD>mpshist-R0-0-26
    Using mpshist-R0-0-26. The name of the directory will be mpshist-R0-0-26.
    cvs checkout -P -r mpshist-R0-0-26 -d mpshist-R0-0-26 mpshist
    cvs checkout: Updating mpshist-R0-0-26
    ...
    $ cd mpshist/mpshist-R0-0-26/
    $ ant 
    ...
  • Push to production and upgrade using cram

     

Start / Stop

...

  • Only one MPS History Server is active at any time
  • To start a new server, you must login as laci on lcls-daemon2

    Code Block
  • /etc/rc3.d/S99st.mpshist start
    
  • To stop

...

  • a production server, type

    Code Block

...

  • /etc/rc3.d/S99st.mpshist stop
    

...

    • Wait 10 seconds!

Troubleshoot

  • The clearest sign of problems is an empty table in the HistoryViewer tab on the MPS GUI
  • Every few months, there seem to be weird socket exceptions that don't halt the server (to be investigated)

Log files

  • Check /u1/lcls/tools/mpsHistoryServer/mpshist.log

Cmlog

  • To check for cmlog messages, specify "MPS History" as facility.

Is the server running?

  • To test whether the Server is running, go as laci to lcls-daemon2

    Code Block

...

  • ps -ef | grep mpshist
    
  • Also, check nohup.out in laci's home directory

Is the server working?

  • To test whether the server is working, use POSI:EP02:400:MTLM_LGC_BYPV, e.g.

    Code Block

...

  • caput POSI:EP02:400:MTLM_LGC_BYPV 1
    

...

  • caput POSI:EP02:400:MTLM_LGC_BYPV 0
    

    Verify that there is a message in the

...

Check if the MPS client connects
Code Block

iocegr@lcls-builder$ iocConsole ioc-bsy0-mp01

/* Be very careful here */
Cexp@ioc-bsy0-mp01>printHistoryServerList()
172.27.8.41:30001       Time-to-live: 20        Is Connected: Yes
0x00000000 (0)

CTRL-a then d to exit
Note: Wait > 20 seconds before restarting the history server.

Cmlog

The cmlog facility is "MPS History".

Reboot

References

http://java.sun.com/docs/books/tutorial/networking/ (esp. sockets and datagrams)
http://darksleep.com/player/JavaAndUnsignedTypes.html (java types from/to bytes)
MPS Fault Logging Statistic Reports