ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/JSOC/CM/V1.0/drms_module.txt
Revision: 1.1.1.1 (vendor branch)
Committed: Tue Oct 2 00:12:21 2007 UTC (15 years, 11 months ago) by arta
Content type: text/plain
Branch: MAIN, Vtag
CVS Tags: Ver_6-0, Ver_6-1, Ver_6-2, Ver_6-3, Ver_6-4, Ver_4-3, Ver_4-0, Ver_4-1, NetDRMS_Ver_8-8, NewTree01_cp03_JSOC, Ver_4-4, Ver_8-5, Ver_4-7, NewTree01_cp05_JSOC, Ver_5-14, Ver_5-13, Ver_5-12, Ver_5-11, Ver_5-10, Ver_LATEST, NetDRMS_Ver_LATEST, Ver_4-6, NewTree01_cp04_JSOC, NetDRMS_Ver_8-12, NetDRMS_Ver_8-10, NetDRMS_Ver_8-11, NetDRMS_Ver_9-1, NetDRMS_Ver_9-0, NetDRMS_Ver_9-3, NetDRMS_Ver_9-2, NetDRMS_Ver_9-5, NetDRMS_Ver_9-4, Ver_7-0, Ver_5-6, Ver_4-5, NewTree01_cp07_JSOC, NewTree01_cp08_JSOC, NewTree01_cp01_JSOC, Ver_4-2, NetDRMS_Ver_9-41, Ver_9-41, NewTree01_cp02_JSOC, NetDRMS_Ver_8-4, NetDRMS_Ver_8-5, Ver_5-8, NetDRMS_Ver_8-6, Ver_5-7, Ver_8-8, NetDRMS_Ver_8-7, NewTree01_cp06_JSOC, Ver_5-9, Ver_8-2, Ver_9-3, Ver_8-0, Ver_8-1, Ver_8-6, Ver_8-7, Ver_8-4, Ver_8-11, Ver_5-3, Ver_5-2, Ver_5-1, Ver_5-0, Ver_7-1, Ver_9-1, Ver_5-5, Ver_8-3, NewTree01_cp09_JSOC, Ver_9-5, Ver_9-4, Ver_8-10, Ver_9-2, Ver_8-12, Ver_9-0, HEAD
Changes since 1.1: +0 -0 lines
Log Message:
First new, reorganized JSOC tree

File Contents

# User Rev Content
1 arta 1.1 1. ============= DRMS Module overview ==============
2    
3     DRMS modules share a common main function found in
4     jsoc/src/base/drms/jsoc_main.c. The module executable is run like a
5     normal Unix command line program (see below) and its main function
6     performs the following steps:
7    
8     1. Parses the command line options and stores them in a
9     global data structure.
10     2. Connects to a DRMS session master process.
11     3. Calls the module's main function "DoIt()".
12     4. If DoIt() returns a non-zero status code, indicating an error,
13     it sends an abort request to the DRMS session master.
14     If DoIt() returns a zero status code (success) it sends a message
15     to the DRMS session master asking it to commit the data generated
16     or modified by the module when the session ends.
17     5. Disconnects from the DRMS session master.
18    
19     The top-level file for implementing a module should
20     look something like this:
21    
22    
23     ------------------ module.c ------------------------
24     #include "drms.h"
25     #include "jsoc_main.h"
26    
27     /* List of default parameter values. */
28     DefaultParams_t default_params[] = {
29     {"parm_name1", "default value1"},
30     {"parm_name2", "default value2"},
31     {"mandatory_parm3", NULL },
32     /* ... more default named parameter values ... */
33     {NULL, NULL} /* List must end in {NULL, NULL}. */
34     };
35    
36     /* Module main function. */
37     int DoIt(void)
38     {
39     int status;
40    
41     /* Do work...
42     ...
43     Set status == 0 to indicate success.
44     Set status != 0 to indicate failure. */
45    
46     return status;
47     }
48     ----------------------------------------------------
49    
50    
51     2. =========== DRMS command line parsing ==============
52    
53     The functions associated with command line parsing are found in
54     jsoc/src/util/util/cmdparams.{c,h}.
55    
56     The DRMS main program parses the module command line and stores
57     the information in a global data structure
58    
59     CmdParams_t cmdparams;
60    
61     that can be used to access the parameters from anywhere within the
62     module code, including library subroutines. The command line consists
63     of four types of tokens
64    
65     * named parameters given in one of the forms "variable= value",
66     "variable=value" or "--variable value"
67     * single letter flags "-a -b -c" which can also be written in
68     concatenated form "-abc". Flags are translated into named single
69     letter named parameters with the value "1".
70     * unnamed argument strings of the form "value"
71     * command line files of the form "@filename". Each line such a file
72     is parsed as an additional command line. Command files may contain
73     references to other command files. Blank lines or lines beginning
74     in "#" are treated as comment lines and ignored.
75     Command line files are a convenient mechanism go circumvent the
76     limitation on the number of command line arguments in most operating
77     systems.
78    
79    
80     -------- example -----------
81     Example: Assume that the file inputs.conf contains the three lines
82    
83     # This is a test
84     input1.txt
85     input2.txt
86    
87     then the command line
88    
89     module.exe -vf test=debug abc.txt --log logfile def.bin @inputs.conf
90    
91     will get parsed to have 3 named parameters
92    
93     v = "1"
94     f = "1"
95     test = "debug"
96     log = "logfile"
97    
98     and 4 unnamed arguments
99    
100     abc.txt
101     def.bin
102     input1.txt
103     input2.txt
104     -------- end example ------
105    
106     The values of the named parameters are read using the following
107     functions:
108    
109     char *cmdparams_get_str(CmdParams_t *parms, char *name, int *status);
110     int8_t cmdparams_get_int8(CmdParams_t *parms, char *name, int *status);
111     int16_t cmdparams_get_int16(CmdParams_t *parms, char *name, int *status);
112     int32_t cmdparams_get_int32(CmdParams_t *parms, char *name, int *status);
113     int64_t cmdparams_get_int64(CmdParams_t *parms, char *name, int *status);
114     float cmdparams_get_float(CmdParams_t *parms, char *name, int *status);
115     double cmdparams_get_double(CmdParams_t *parms, char *name, int *status);
116     double cmdparams_get_time(CmdParams_t *parms, char *name, int *status);
117    
118     If the named parameter is was not given on the command line
119     the functions above try to obtain its value from the environment
120     using the getenv function. Therefore the commands
121    
122     module.exe blah="Hello"
123    
124     and
125    
126     setenv blah Hello
127     module.exe
128    
129     should have the same outcome.
130    
131     The function
132    
133     int cmdparams_exists(CmdParams_t *parms, char *name);
134    
135     returns 1 if a named parameter matching the string in "name"
136     was given on the command line, and 0 if no such parameters was
137     given.
138    
139     The (string) values of the unnamed arguments are read using the
140     following functions:
141    
142     char *cmdparams_getarg(CmdParams_t *parms, int num);
143     int cmdparams_numargs(CmdParams_t *parms);
144    
145    
146     cmdparams_getarg(cmdparms, 0);
147    
148     returns the name of the running program (argv[0]).
149    
150     Default values for parameters can be given in the global struct
151     default_params that must be present in the module. The struct
152     takes the following form:
153    
154     DefaultParams_t
155     default_params[] = {
156     {"parm_name1", "default value1"},
157     {"parm_name2", "default value2"},
158     {"mandatory_parm3", NULL },
159     /* ... more default named parameter values ... */
160     {NULL, NULL} /* List must end in {NULL, NULL}. */
161     };
162    
163     If the value field in the struct for a given parameter is
164     NULL it means that the parameter is mandatory and must be
165     present on the command line. If not, an error message will
166     be printed out and the module terminated immediately after
167     command line parsing.
168    
169    
170     3. =========== DRMS data functions ==============
171    
172     The module read and writes data using the functions described in
173     jsoc/CM/*/drms_api.txt.
174    
175    
176     4. =========== Running a DRMS module ===========
177    
178     Running one or more DRMS modules involves three main steps
179    
180     a) starting a DRMS session,
181     b) runnning the module(s) and
182     c) closing the session.
183    
184     The final step will either commit all the data generated by
185     modules in the session or discard it if an error occured.
186    
187     The script /jsoc/scripts/drms/drms_run automates the three steps
188     detailed below, and allows modules (or scripts containing multiple
189     module commands) to be run with a single command.
190     The command
191    
192     host:~> drms_run <command> [options...]
193    
194     will start a new DRMS server, run <command> and depending on the exit
195     status of <command> will either commit or discard changes to the
196     database and stop the DRMS server. drms_run will use the drms_server
197     executable pointed to by the environment variable DRMS_SERVER_EXE. If
198     DRMS_SERVER_EXE is not set drms_run will assume that an executable
199     "drms_server" is in your path. The output from the DRMS server is
200     piped to the file pointed to by the environment variable
201     DRMS_LOGFILE. If DRMS_SERVER_EXE is not set drms_run will create a log
202     file in /tmp/DRMS.<pid>, where <pid> is the PID of the drms_run
203     script interpreter.
204    
205     The three steps are carried out as follows:
206    
207     a) Before you run modules you must have a DRMS server running to
208     act as a session master. This can be done by running the command
209    
210     host:~> jsoc/bin/<target>/drms_server -f
211    
212     The server will print out what interface it is listening
213     for connections on. For example:
214    
215     akhenaten:~/jsoc> bin/custom.akhenaten/drms_server -f
216     DRMS_HOST = akhenaten.Stanford.EDU
217     DRMS_PORT = 33137
218     DRMS_PID = 20955
219     DRMS_SESSIONID = 38
220     DRMS server started with pid=20955, noshare=0, noroe=0
221     ...
222    
223     The "-f" flag makes the server run in the foreground. Without
224     "-f" the drms_server command spawn a server in a background
225     process, prints the connection info to stdout (as above)
226     and exits.
227    
228     The server will print log messages to stdout and
229     stderr (TBD: Clean up error handling and logging.), and these
230     should be piped to a file if you intend to keep them.
231    
232    
233     b) Now you can run the module(s). The modules do not need to run on
234     the same host as the server. They can run on any host as long as
235     they are able to open a TCP socket connection to the server
236     process.
237    
238     When running a module, the named parameter DRMSSESSION must be set
239     to indicate the host and port where the DRMS server is listening
240     for connection attempts. It is perhaps most convenient to do this
241     by setting the environment variable DRMSSESSION. In the example above
242     this would mean executing the command:
243    
244     akhenaten:~/jsoc> setenv DRMSSESSION akhenaten:33137
245    
246     Each module that connects causes the server to spawn a new thread
247     to service the new client. The server can service multiple
248     clients simultaneously, but database operations are serialized
249     within the server and executed sequentially using a shared
250     connection to the DRMS database.
251    
252    
253     3. When all modules have finished successfully you can either
254    
255     a) tell the DRMS server stop and commit all data generated or
256     modified by the modules to the DRMS database by sending a
257     SIGUSR1 signal to it. In the example above that would mean
258     issuing the command
259    
260     akhenaten:~/jsoc> kill -s USR1 20955
261    
262     or if an error occurs you can
263    
264     b) tell the DRMS server to abort and discard all data generated
265     by the modules by sending it a SIGTERM, SIGQUIT or SIGINT.
266     In the example above that could be done by pressing CTRL-C
267     in the terminal where the server is running or by issuing
268     the command
269    
270     akhenaten:~/jsoc> kill -s INT 20955
271    
272     It should be safe to kill the server with SIGKILL (kill -9).
273     It will have the same effect as a regular abort except that it
274     leaves a stale entry in DRMS's active session table.
275    
276