**
**  rteval-parsed - the rteval XML report parser
**

The purpose of the daemon is to off load the web server from the heavy duty
work of parsing and processing the rteval XML reports.  The XML-RPC server
will receive the reports and put the files in a queue directory on the
file system and register the the submission in the database.  This will notify
the rteval-parsed that a new report has been received and it will start
processing that file independently of the web/XML-RPC server.


** Installing the software

  !! Please install also the rteval-xmlrpc package and read the !!
  !! README.xmlrpc file also for setting up and preparing the   !!
  !! database which the rteval-parserd program will be using.   !!
  !! This file will also contain information regardingupgrading !!
  !! the database.                                              !!

When installing this application from a binary package, like RPM
files on Fedora/RHEL based boxes, you should have the rteval-parserd
in your $PATH.  Otherwise, when installing from sources, the configure
script defines the default paths.


** Configure rteval-parsed

When starting the rteval-parserd via the init.d script (or via the 'service'
command on RHEL/Fedora distributions) it will use the values configured in
/etc/sysconfig/rteval-parserd.

The available parameters are:

    - NUM_THREADS
      When this is not defined, the default behaviour is to use the number
      of available CPU cores.  The init.d script will detect this
      automatically.

    - LOG
      This defines how logging will be done.  See the rteval-parserd
      arguments description further down in the document for more
      information.

    - LOGLEVEL
      Defines how verbose the logging will be.  See the rteval-parserd
      arguments description further down in the document for more
      information.

    - CONFIGFILE
      The default configuration file rteval-parserd will try to read is
      /etc/rteval.conf.  See the next paragraph for more information about
      this file.  This argument let you override the default config file.

    - PIDFILE
      Defines where the init.d script will put the PID file for the
      rteval-parserd process.  The default is /var/run/rteval-parserd.pid

This daemon uses the same configuration file as the rest of the rteval program
suite, /etc/rteval.conf.  It will parse the section named 'xmlrpc_parser'.

The default values are:

  - xsltpath: /usr/share/rteval
    Defines where it can find the xmlparser.xsl XSLT template

  - db_server: localhost
    Which database server to connect to

  - db_port: 5432
    Which port to use for the database connection

  - database: rteval
    Which database to make use of.

  - db_username: rtevparser
    Which user name to use for the connection

  - db_password: rtevaldb_parser
    Which password to use for the authentication

  - reportdir: /var/lib/rteval/report
    Where to save the parsed reports

  - threads: 4
    Number of worker threads.  This defines how many reports you will
    process in parallel.  The recommended number here is the number
    of available CPU cores, as having a higher thread number often
    punishes the performance.  The default value is 4 when rteval-parserd
    is started directly.  When started via the init.d script, the default
    is to start one thread per CPU core.

  - max_report_size: 2097152
    Maximum file size of reports which the parser will process.  The
    default value is 2MB.  The value must be given in bytes.  Remember
    that this value is per thread, and that XML and XSLT processing can
    be quite memory hungry.  If this value is set too high or you have too
    many worker threads, your system might become unresponsive for a while
    and the parser might be killed by the kernel (OOM).

  - measurement_tables: cyclic_statistics, cyclic_histogram, hwlatdetect_summary, hwlatdetect_samples
    Declares which measurement results will be parsed and stored in the
    database.  These names are referring to table definitions in the
    xmlparser.xsl XSLT template.  The definitions in this template tells
    rteval-parsed which data to extract from the rteval summary.xml report
    and where and how to store it in the database.


** rteval-parserd arguments

  -d | --daemon                    Run as a daemon
  -l | --log        <log dest>     Where to put log data
  -L | --log-level  <verbosity>    What to log
  -f | --config     <config file>  Which configuration file to use
  -t | --threads    <num. threads> How many worker threads to start (def: 4)
  -h | --help                      This help screen

- Configuration file
By default the program will look for /etc/rteval.conf.  This can be
overridden by using --config <config file>.

- Logging
When the program is started as a daemon, it will log to syslog by default.
The default log level is 'info'.  When not started as a daemon, all logging
will go to stderr by default.

The --log argument takes either 'destination' or a file name.  Unknown
destinations are treated as filenames.  Valid 'destinations' are:

    stderr:             - Log to stderr
    stdout:             - Log to stdout
    syslog:[facility]   - Log to syslog
    <file name>         - Log to given file

For syslog the default facility is 'daemon', but can be overridden by using
one of the following facility values:
    daemon, user and local0 to local7

Log verbosity is set by the --log-level.  The valid values here are:

    emerg, emergency    - Only log errors which causes the program to stop
    alert               - Incidents which needs immediate attention
    crit, critical      - Unexpected incidents which is not urgent
    err, error          - Parsing errors.  Issues with input data
    warn, warning       - Incidents which may influence performance
    notice              - Less important warnings
    info                - General run information
    debug               - Detailed run information, incl. thread operation

- Threads
By default, the daemon will use five threads.  One for the main threads which
processes the submission queue and notifies the working threads.  The four
other threads are worker threads, which will process the received reports.

Each of the worker threads will have its own connection to the database.  This
connection will be connected to the database as long as the daemon is running.
It is therefore important that you do not have more worker threads than
available database connections.


** POSIX Message Queue

The daemon makes use of POSIX MQ for distributing work to the worker threads.
Each thread lives independently and polls the queue regularly for more work.
As the POSIX MQ has a pretty safe mechanism of not duplicating messages in the
implementation, no other locking facility is needed.

On Linux, the default value for maximum messages in the queue are set to 10.
If you receive a lot of reports and the threads do not process the queue
quickly enough, it will fill up pretty quickly.  If the queue is filled up,
the main thread which populates the message queue will politely go to sleep
for one minute before attempting to send new messages.  To avoid this, consider
to increase the queue size by modifying /proc/sys/fs/mqueue/msg_max.

When the daemon initialises itself, it will read this file to make sure it
uses the queue to the maximum, but not beyond that.


** PostgreSQL features

The daemon depends on the PostgreSQL database.  It is written with an
abstraction layer so it should, in theory, be possible to easily adopt it to
different database implementation.

In the current implementation, it makes use of PostgreSQL's LISTEN, NOTIFY and
UNLISTEN features.  A trigger is enabled on the submission queue table, which
sends a NOTIFY whenever a record is inserted into the table.  The rteval-parser
daemon listens for these notifications, and will immediately poll the table
upon such a notification.

Whenever a notification is received, it will always parse all unprocessed
reports.  In addition it will also only listen for notifications when there
are no unprocessed reports.

The core PostgreSQL implementation is only done in pgsql.[ch], which provides an
abstract API layer for the rest of the parser daemon.


** Submission queue status codes

In the rteval database's submissionqueue table there is a status field.  The
daemon will only consider records with status == 0 for processing.  It do not
consider any other fields.  For a better understanding of the different status
codes, look into the file statuses.h.
