450 likes | 576 Vues
This document explores the architecture and design considerations for the SLC Interactive Operations Controller (IOC) database service. Key topics include various use cases, initialization protocols, data structure specifications, and the process of message handling between Alpha and the IOC. The piece details the download sequence, message conversion (ST0), and dynamic handling of setpoints and updates. Additionally, it outlines the utilities for managing input/output operations, thread initialization, and diagnostic inquiry processing. The aim is to optimize data flow and ensure seamless communication between system modules.
E N D
SLC Aware IOC Database Service Design Debbie Rogind Nov 11, 2004
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB Input/Output Utilities
DB Service Use Cases • DBEX - “Look like” a tcp micro • Same message formats, traffic, use proxy • Req and Accept database (“IPL”) • Accept updated setpoints from Alpha • Provide updated data from IOC • Supertype 3 (ST3) readbacks • Supertype 2 (ST2)setpoints (new) • Accept and reply to diagnostic inquiries • Accept and Process DBEX up/down messages • Console Users • Utilities to edit, dump, get type of various slc data • Application code • Utilities to find, get, put, update slc data • Coded “data flow dependancies” • ??? What else
Design Considerations • Port as much existing micro code as possible • Messages from VMS control system are little-endian, VMS format, and packed • The VMS supertype header structure is packed – no “pad” exists between 4 byte boundaries • Support ASCII representations for primary, secondary names and units • Slc IOC needs supplementary data definition: • primary ASCII to # • secondary (secn) ASCII to # mappings for given primary • datum width (for I or Z)
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB Input/Output Utilities
DB Thread Initialization • slcExec starts Phase 1 message Q’ed threads dbSend, dbHdlr • slcExec starts Phase 2 dbRecv after all Phase 1 actives are T • All db threads • Create cmlog handle • Init resources • Message queue • Sockets • Memory heap • Timers, semaphores • Set active = T • Wait (at message Q or socket) • dbHdlr thread initializes shared db thread globals • slcExec sends “DB_DOWNLOAD” to dbSend
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB I/0 Utilities
DB Service Globals Globals for db threads, initialized by dbHdlr: • downloadEvent, dbExists flag is created by slcExec • dbHdlrThread signals downloadEvent, sets dbExists flag after db download / ST 0 conversion
Buffer/Q Structures • Rcvbuf, sndbuf get cast to dbsndrcvbuf_ts • dbRecv converts to nativeSB -VMStohSupHdr() • DB Thread Queue message structure • dbSend uses nativeSB • Converts prior to sending htoVMSSupHdr()
Secondary Data • The secondary data is discussed in later slides (after ST0 Conversion and the “new” dictionary is discussed)
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB I/0 Utilities
dbRecvThread – Download (“IPL”) Sequence • Rcvbuf receives Supertype 0-3 messages from DBEX at dbex socket • VMStohSupHdr(rcvbuf.nativeSB, rcvbuf.supblk) • Sends “DB_DBEX_ACK” to dbSend Q to ack DBEX (if req’ed) • Validates data and proper sequence of download (dbmicromail) • Allocates super block memory (dbsuperalloc) from heap; populates dbnode_p[0] • Copies rcvbuf (dbmsgcopy) to alloc’ed memory; drops proxyhdr • Lock / unlock dbRWMutex around memcpy • Send “DB_CONVERT” to dbHdlr • Upon recv’ing last ST 3 block
dbSendThread – Download (“IPL”) Sequence • Receives “DB_DOWNLOAD” message from slcExec • Sends “ack” to DBEX socket • Formats sndbuf.nativeSB • htoVMSSupHdr(sndbuf.supblk, msg.nativeSB) • Pre-fixes proxy_hdr • Sends • (dbdownloadme) • Receives “DB_DBEX_ACK” messages from dbRecv for each ST 0-3 block received • Sends “ack” to DBEX socket • uses msg.nativeSB.id; • htoVMSSupHdr(sndbuf.supblk, msg.nativeSB) • Pre-fixes proxy_hdr • Sends
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB I/0 Utilities
dbHdlrThread • dbHdlr is responsible for • Initializing the DB Globals upon init • Converting the ST0 data to dictionary format • Releasing DB resources upon exit • Resetting global values upon exit • dbExists • downloadEvent • Thread specific – see General Thread Shutdown • Receives DB_CONVERT message to initiate the ST0 Conversion process • After conversion • Sets dbExists = T • Signals downloadEvent • Receives TEST_STOP message • Refer to General Thread Shutdown
Secondary Data type Gphash find - gphFind (“name”) - returns GPHENTRY*:
dbHdlrThread - ST0 Conversion Sequence • Receives “DB_CONVERT” message from dbRecv • Replace ST0 num-oriented hash table with string based hash table dictionary • Step 1: • Walk thru all structures in ST0 to swap words and longs (if arch. is not little endian) • Step 2: • Read PRIMARY.MAP file and make entries into dictionary, each combining • Secondary data from ST0 • File data – data width, ASCII names • Hash on “primary unit secondary” • Hash on “primary” • Links ALL* units • For primary name error checking • Could also hash on “primary secondary” • For faster secondary name error checking • Structure is optimized for run-time operations
dbHdlrThread - ST0 Conversion Sequence • Correlates file with ST0 data PRIMARY.MAP: Prim catn Sec secn fmt width # QUAD 1 BMON 135 R 4 1 QUAD 1 KTIM 31 T 8 1 … • For each unique primary name in file Make “primary” entry call dbunitsST0 (ld_p, catn) if (status OK and ld_p.len>0) for each unit# in list dbgetUpsST0(uptr, catn, unit) link unit in “primary” (for ALL*) for every secondary in file dbgetSecST0(sptr,uptr,secn) store “primary unit sec” with combined ST0 & file data; + link sec in unit entry (for ALL*)
dbHdlrThread - ST0 Conversion Sequence • Delete ST0 • Signal downloadEvent, sets dbExists flag • Comments • Translated dblistu.a38 to C • Uses memory manager (freeList) to manage new slcSubblk_ts w combined data • Optimized for: dblists in thread’s init: dblist(dblist_p, prim1, unit1, sec1) dblist(dblist_p, prim2, unit2, secn) etc. And “on the fly” access, such as operator
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB I/0 Utilities
dbRecvThread – Alpha Updates to slc ioc • Receives Supertype 2 (setpoint) update messages from DBEX • Sends “DB_DBEX_ACK” msg to dbSend, if req’ed. • Lock dbRWMutex • Copies super block recv’ed (dbmsgcopy) to slc ioc ST2 block • Unlock dbRWMutex • Other DBEX messages • Receives diagnostic req from DBEX • Sends “DB_DIAG_RPY” to dbSend Q to ack DBEX • Receives “DXDN”, “DXUP” messages from DBEX • Resets/sets dbex_up flag • Stores database version in global dbVersion • If DBEX becoming available, send “DB_UPDATE_ALL” message to dbSend Q to update all jobs (TBD)
dbSendThread –Alpha Updates to slc ioc • Receives DB_DBEX_ACK messages from dbRecv for Alpha ST2 updates • Sends “ack” to DBEX socket (same as “IPL” sequence) • Receives DB_DIAG_RPY message from dbRecv • uses msg.nativeSB.id • VMStoh(sndbuf.diag, msg.diag) • Process diagnostic data • htoVMSSupHdr(sndbuf.supblk, msg.nativeSB) • htoVMS(sndbuf.diag, msg.diag) • Pre-fixes proxy_hdr • Sends to dbex socket • (dbmdiag_sendrpy) • Receives TEST_STOP message • Refer to General Thread Shutdown
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • dblput • DB I/0 Utilities
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • Dblput • SLC IOC DB Updates to Alpha • DB I/0 Utilities
dbSendThread – slc ioc updates to Alpha • Receives DB_UPDATE messages from various “job threads” to send update • Lock dbhilo_mutex[job] – prevent further updates for this job • Compress job’s list of pending updates, if possible (microdbsendc) • Lock dbRWMutex • Read dbhilo_update[job] sptr pair • memcpy data from ST block indicated by sptr pair into sndbuf (microdbsendb) • Unlock dbRWMutex • Increment msg seq # (1-256), write in proxyhdr.user_byte • store seq #, “job id” locally • Send sndbuf (already in VMS format) to dbex socket
dbSendThread – CTL socket After sending data to dbex socket, loop waiting at CTL socket for Ack from DBEX • Further updates for this job are blocked; other job updates q’ed • Timeout after ~15 sec (less if !dbex_up) • Wait 1 sec at ctl socket • Check for slcExec “stop flag” CTL loop exit conditions: 1)Successful Ack (valid msg seq #) • Clear dbhilo_update[job] • If (! dbex_up), set dbex_up flag 2) Invalid msg seq # • If (! dbex_up), set dbex_up flag ; no clear 3) Timeout – no clear 4) Socket error • Set “lost connection flag” ; no clear • Loop waiting for connection • Check for slcExec “stop flag” Unlock dbhilo_mutex[job] Signal ackEvent[job] • Upon dbex_up / connection up • Send updates for all jobs
Topics • DBS Use Cases • Design Considerations • DBS Initialization • Data Structures • Download Sequence • ST0 Conversion • Receive/Process Setpoints and other messages from Alpha • Process/Send SLC IOC udpates to Alpha • DB Input/Output Utilities
DB I/O Utilities • Threads use dballoc(), dbfree(), and db macros for list management • dballoc() / dbfree() use mem management • Re-entrant • Return 4byte unsigned VMS cond code • Except dbexists returns epicsBoolean • All device args (prim,unit, secn) are 4 chars; blank padded, null-terminated; prim/secn are left justified; unit is right-j? • dblist (dblist_p, “prim”,”unit”,”secn”) • Unit can = “ALL*” • dblunits (dbdata_p, “prim”) • dblget (dbdata_p, dblist) • dblput (dbdata_p, dblist) • dballoc (dbdata_p, numBytes, numElements) • dbfree (dbdata_or_list_p) • dbunit2string (intUnit, “unit”) • dbexists (void)
DB I/O Utilities – cont. • micro_dbsend(job) • All threads call to send their updates to Alpha • Threads wait for ack or timeout • DB I/O utils wait on downloadEvent prior to access • Calling threads are held off until after db is downloaded; timeout in case of failure • Shell commands check dbExists() before calling dbl* utils • Error conditions • A dblist (dblist_p, prim, unit, secn) of either non-existent primary, unit, or secondary returns an error, except if unit = ALL* • A dbunits (dblist_p, prim) of non-existent primary returns an error
DB I/O functionality • Dblist (dblist_p, prim, unit, secn) • Calls gphFind (“prim unit secn”) • Enters ptr to entry into dblist_p • Dblist (dblist_p, prim, ALL*, secn) • Calls gphFind (“prim”) • Traverses linked list of prim/unit; for each entry, traverses linked list of secns to find; gets ptr from matching entry’s data • Enters ptr to entry in dblist_p • Dblunits (dbdata_p, prim) • Calls gphFind (“prim”) • Traverses linked list of prim/unit; for each entry, enters (4 char) unit(s) into dbdata_p
DB I/O functionality • Dblput (dbdata_p, dblist_p) • Converts native typed input dbdata to VMS typed data and stores to dblist location • locks / unlocks dbRWMutex around memcpy of data to ST block • Calls dbhilo_update (job, hi, lo) • inserts hi, lo offset pairs into dbhilo_update[job] • locks / unlocks dbhilo_mutex[job] • Dblget (dbdata_p, dblist_p) • sets/resets dbRWMutex around memcpy from ST block data • Converts retrieved data to native • Inserts in dblist
Shell commands Shells: EPICS iocsh, RTEMS Cexp, vxWorks • All previous dbl* utils can be called from ioc shell after parsing console input. • dbexists() will be checked prior to calling underlying dbl* utility - no waiting for user • dbgettype (“prim”, “secn”) • dbdump (“prim”, “unit”, “secn”, “<filename>”) • dbdumpunits (“prim”, “<filename>”) • dbedit (“prim”, “unit”, “secn”,…) • dbdumphash (“<filename>”) • dbdumpdatabase (“<filename>”)