SLC Database Service
Download
Report
Transcript SLC Database Service
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:
Name
Type
Represents
dbnodes_p[5]
dbsuptype_tu
Pointers to superblocks 0-3
dbRecv mallocs, writes pointers & data
while other threads are blocked at db
download event.
After download event pointers read-only (ptr
to ST0 & data deleted; rest never change)
dict_p
void *
Pointer to dictionary; new char-based
gphash table created for housing supertype
0 data (secondary data & location) and valid
ASCII names.
gphash has its own mutex protection for
add/delete/find dictionary utilities.
dbex_up
dbVersion
epicsBoolean
char *
Status of dbex up (T) or down (F)
Db major / minor version w dbex_up msg
dbRWMutex
epicsMutexId
Activiated for reads or writes from/to
supertype 1-4 data. dbRecv (for Alpha
VMS updates), and dbl* I/O utilities access
dbhilo_updates
[N_JOBS]
Dbhilo_job_ts *
Each “job service” array contains pairs of
offsets to upper and lower bounds of
modified ST2/3 data. Acc’ed by utility rte
dbhilo_update called from dblput.
dbhiloMutex
[N_JOBS}
epicsMutexId
Activiated for reads or writes from/to
dbhilo_updates[ ]. Acced by dbSend, and
private utility dbhilo_update called by dblput
dbAckEvent
[N_JOBS}
epicsEventId
Job service threads wait at this event until
their updated data has been acknowledged
by Alpha
• downloadEvent, dbExists flag is created by slcExec
• dbHdlrThread signals downloadEvent, sets dbExists flag after
db download / ST 0 conversion
Supertype 0 Byte Stream
to/from Alpha
fwd_hdr_ts
proxy header
dbsuptypehdr_ts
supertype header
links – next UPS, unit,
collided nodes
len - ups + nsub’s
catn - prim #
unit - unit #
nsub - # of secns
hash length
array listhead ptrs
array node counts
UPS block 0
secn block [0 – nsub]:
supn | subn
fmt | slen
sptr =
offset in supn
…
….
UPS block X
secn block [0 – nsub]
Supertype 1-3 Byte
Stream
fwd_hdr_ts
proxy header
dbsuptypehdr_ts
supertype header
data
data
data
data
data
data
….
Supertype Header & Data
Name
Data type
Represents
ip_port_u
len
user
cmd
ip_port_tu
int4u
user_field_ts
int1u
crc
int1u
Lower half of the ip address, and the
port number
Message bytecount - this fwdheader
User defined; chunk count for large
buffers;
Fwd_server command, e.g.
8 bit crc over header; currently set to
0x55
fwd_hdr_ts
dbsuptypehdr_ts
network
netlsn
id
<<<<<
len
micr
blkbeg
blkend
datw[ ]
Note
or
int2u
int2u
int2u
potential byte
int4u
Int4u
int4u
int4u
Array of int2u
dbsuptype_tu = union
Type of data
alignment mistmatch here >>>>>
Size of superblock
Microname
Copy to location in superblk
Copy from location in superblk
type-specific data; packed; max size
is NETBUFLEN minus
sizeof(dbsuptypehdr_ts)/2
Buffer/Q Structures
Rcvbuf, sndbuf get cast to dbsndrcvbuf_ts
dbRecv converts to nativeSB -VMStohSupHdr()
Name
Data type
dbsndrcvbuf_ts
proxy_hdr
supblk
nativeSB
Represents
Receive and send buffers
fwd_hdr_ts
dbsuptype_tu
dbsuptypehdr_ts
Proxy header
Superblock header + data
Native superblock header
structure added for slc ioc
DB Thread Queue message structure
Name
Data type
dbmsgmail_ts
msgheader
nativeSB
dbdiag
Represents
Q messages
msgheader_ts
dbsuptypehdr_ts
dbdiagmsg_ts
Msg header
Native superblk hdr
Diagnostic data
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
DB Service Download Block
Diagram
DBEX
Proxy
CTL socket
DBEX socket
3 Supertype Data
7 Ack
0, 6 Wait at socket
dbSend
dbmicromail
dbsuperalloc
dbmsgcpy
dbRecv
2 Download Request
4
DB_ACK_DBEX
(set db RWMutex)
5 Write supertype data
(reset dbRWMutex)
8 DB_CONVERT
1
dbHdlr
DB_DOWNLOAD
Repeat steps 3-7 as required by DBEX
dbRWMutex
dbnodes_p[1]
dbnodes_p[0]
ST 1
dbnodes_p[2]
ST 0
ST 2
dbnodes_p[3]
ST 3
SLC DB
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
dbHdlr Block Diagram
DBEX socket
PRIMARY.MAP
dbRecv
dbSend
NFS
8 DB_CONVERT
SLC IOC
dict_p
dbHdlr
dbRWMutex
dbnodes_p[1]
dbnodes_p[0]
ST 1
dbnodes_p[2]
Dictionary
ST 2
ST 0
dbnodes_p[3]
SLC DB
ST 3
Signal downloadEvent
dbExists = epicsTrue
Dictionary
Int
tablesize
Int
nShift
ELLIST **
list_pp
epicsMutexId lock
dict_p
“primary unit secondary” “QUAD 701 BDES”
Count 2
slcSubblk_ts *
Int1u
Int1u
Int1u
Int1u
Int4u
Int1u
“primary unit secondary”
Count 1
Count 1
secn sec #
supn ST #
len
word length
format (I,A,R,Z,S,T)
sptr word offset
width datum width
(1,2,4,8)
slcSubblk_ts
dbnodes_p[supn]
“primary” (not in ST 0)
primary = “QUAD”
Count =
20
201
301
ST 1
401
701
...
...
“BDES”
GPHENTRY *
ST2
ST3
...
Secondaries
...
...
Units
gphash
Secondary Data type
Name
Data type
slcSubblk_ts
secn
supn
len
format
sptr
width
Represents
SLC Secondary data type
int1u
int1u
int1u
int1u
int4u
int1u
Secondary number
Supertype number
Word length (V=variable)
(I,A,R,Z,S,T)
Word offset into supn block
1,2,4,8 bytes; data width
Gphash find - gphFind (“name”) - returns GPHENTRY*:
Name
Data type
GPHENTRY
node
name
pvtid
userPvt
Represents
SLC Secondary data type
ELLNODE
Const char *
Void *
Void *
Link node
“primary unit secondary”
Pointer to slcSubblk_ts
Not used
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
QUAD
1
BMON
QUAD
1
KTIM
secn fmt
width #
135
R
4
1
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
Setpoints from Alpha
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
Writing Data from slc ioc
(dblput)
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
slc ioc DB Updates to
Alpha
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>”)