CHANGES FROM 2.4.0 TO 2.6.0

2.6.0

 o Improved error reporting when connections are shut down due to misbehaving
   clients.

2.5.4:

 o Windows Service is now fully and natively supported.
 
 o Documentation completely revamped. The README file has been converted to
   Docbook and reorganised. Man pages added. HTML format added.
   
 o Eliminated (mostly) the confusing distinction between cold & warm start.
   The server now just 'does the right thing' in most circumstances. Renamed
   the '-s' (cold Start) option to '-p' (port), because of its more limited
   scope.

 o Unlimited complexity when specifying Event Channel Factory name & kind.
   New path-like syntax for '-n' & '-N' options. Eliminated '-k' & '-K' options
   that used to set the 'kind'.

 o Renamed the '-d' (debug) option to '-f' (foreground).

 o Fixed a bug that caused occasional core-dumps when connections were very
   quickly followed by disconnection.

2.5.3:

 o Federated event channels are now supported. Connect a `source' event channel
   to a `sink' channel using the 'eventf' command. Events are pushes from the
   source to the sink. The relationship is stored persistently and
   re-established when one or both of the the channels is restarted.
   
   Federation improves performance over a wide area network (or the internet).

 o Real-time mode improves push-push delivery times for low-volume traffic.
   Activated by compile-time macro OMNIEVENTS_REAL_TIME_PUSH. On by default.

 o New IDL module `omniEvents'. Contains derived interfaces for EventChannel
   and EventChannelFactory.
   
   New interfaces omniEvents::EventChannel & omniEvents::EventChannelFactory now
   inherit from interface FT::PullMonitorable. Clients can call the is_alive()
   operation to confirm that the omniEvents server is still running.

   New interface omniEvents::EventChannelFactory inherits from OpenOrb's
   EventChannelFactory interface. So clients built to work with OpenOrb's event
   service can now call create_channel() and join_channel() on omniEvents.

 o You can change the traceLevel while the application is running. Send the
   server SIGUSR1 to bump its traceLevel up by 5. The traceLevel is wrapped at
   45, so you can always get it back to where it started by repeatedly sending
   SIGUSR1.

   E.g.   % kill -USR1 `cat /var/run/omniEvents.pid`

omniEvents daemon
-----------------

 o The omniEvents server now runs as a daemon on Unix platforms. Output is
   sent to syslog. The application can now maintain its own PIDFILE (-p option).
   It also shuts down cleanly when it receives SIGTERM or SIGINT.

   The 'etc' directory contains a SysV-style init script and a config file.
   To install the service: 'omniorb-eventservice' on a Unix platform, type:
     % su root
     # cd omniEvents/etc
     # make install
   You have to manually set up the symbolic links in rcX.d so that init will
   automatically start & stop the daemon as you change runlevels.

 o New option: -p PIDFILE
 
   A running server saves its PID in PIDFILE, and deletes the file when it
   quits. The server will refuse to start if PIDFILE already exists and contains
   the PID of a running process.
   
   PIDFILE should usually be set to `/var/run/omniEvents.pid'.
  
 o New option: -d
 
   Debug mode. Forces the server to remain in the foreground.
   Disables logging to syslog.
   
 o New option: -t TRACEFILE
 
   Redirects output to TRACEFILE from stderr or syslog.
  
New EventChannel parameters
---------------------------

 o FilterId (eventc -t REPOSITORY_ID)

   Create a new channel with an event type filter. Only types whose RepositoryId
   matches the parameter are permitted to pass through the channel. Other
   events are silently ignored.

2.5.2:

omniEvents daemon
-----------------

 o New option: -a ENDPOINT
 
   Sets an alternate endPoint for the server. All CORBA object references
   generated by the server include the alternate address. When clients cannot
   contact the server, they automatically fall back to trying the alternate
   address.
   
   This option is exactly equivalent to the ORB parameter `endPointNoListen',
   except that the value is saved in the server's persistency log file, so that
   it is remembered whenever omniEvents is warm started.
   
   `-a' is a cold start option. It can only be used when the log directory is
   empty and the `-s' startup option is used.
      
 o New option: -v
 
   Verbose mode. Prints the following information to standard output when the
   server starts:
    port               - set with the `-s' option at cold start.
    alternate endpoint - set with the `-a' option at cold start.
    IOR                - the IOR of the EventChannelFactory object.

New EventChannel parameters
---------------------------

 o InsName (eventc -i NAME)
 
   This parameter sets the name by which the EventChannel is known in omniEvents
   INSPOA. You can refer to the channel with a corbaloc string like this:
   
   corbaloc::host:port/NAME

   Replace `host' with omniEvents' hostname and `port' with the TCP port you
   chose with the -s option.
 
 o CyclePeriod_ns (eventc -c NANOSECONDS)
 
   Sets the cycle period of the channel. This is the time that the channel
   waits before transferring messages from the incoming queue to the outgoing
   queue. While messages are being transferred, incoming calls are queued. The
   default is 0.1 seconds. Applications that require very rapid message
   delivery should reduce the period. The tradeoff represented by this
   parameter can be represented like this:

   PERIOD:  short <-----------------------------------------> l o n g
          rapid delivery                                   low CPU usage
          less chance of queue overflow                  more responsive

2.5.1:

The C++ examples have better exception handling, and have been ported to use
the POA rather than the BOA.

There are new Java examples in examples/java. Not all of the examples have been
translated into Java yet, but these should be enough to get you going.

New Autoconf macro: aclocal.d/AC_CORBA_OMNIEVENTS.m4. This is not used by
omniEvents itself, but is intended for other packages that want to use
omniEvents.

Experimental shared library version on omniEvents. THIS IS A WORK IN PROGRESS.
The `class Orb' needs to be refactored in order to allow foreign CORBA code to
share its Orb with omniEvents. There is a new `lite' version of the daemon,
that uses the dynamic library. It's not built by default, but you can buid it
by running: `cd src && make oelite'.

New file format for the persistency log. The format expresses the same
hierarchy as the old, but in such a way that changes can simply be appended to
the end of the file, rather than havig to re-dump the whole hierarchy. This
should help performance and disk usage in environments with lots of Proxies. We
no longer use the lex/yacc parser see src/PersistNode.{h,cc} instead.

New option: -V causes omniEvents to report its version.

2.5.0:

This is an EXPERIMENTAL POA implementation of the OMG Event Services
Specification v1.1 for omniORB. It builds upon the foundation of omniEvents
v2.4. omniEvent's reliance on the old BOA architecture has been a serious
impediment to developing further features. This release implements all of the
basic Event Service features of omniEvents 2.4.

Features

This new version contains a number of significant enhancements over the
previous one. I've individually designed each Proxy type for optimal
performance, and minimal use of system resources. In particular, this
implementation uses very few threads per channel, which helps to cut down on
complexity and on locking overheads. It's been quite interesting. Although they
seem superficially similar, I've found that the challenges are actually quite
distinct.

    * ProxyPushConsumer. Implemented as a (mostly) stateless `DefaultServant'.
      The ProxyPushConsumer doesn't really care from whom messages are
      arriving, so I've used a single DefaultServant in a stateless POA to
      avoid expensive lookups in the active object map.

      Relies upon POA::Current to identify the source of disconnect messages.
      Sadly, POA::Current is only implemented in omniORB4. Without POA::Current,
      only stateless connections are supported (no disconnect callbacks).

    * ProxyPullConsumer. All outgoing calls are performed through the Dynamic
      Invokation Interface's (DII) send_deferred() method. This enables a
      single thread to manage communication with all connected suppliers,
      rather than having to use a thread per connection.

    * ProxyPushSupplier. Again, all outgoing calls are performed through the
      DII's send_deferred() method. A dedicated thread is used to maximize the
      output rate of events. Outgoing events are queued in a circular buffer
      that naturally discards the oldest messages if a Consumer can't keep up
      with the incoming event rate.

    * ProxyPullSupplier. The trickiest of the four, and the one where I've made
      the biggest compromise. try_pull() mode is straightforward, but pull()
      calls should really block until an event becomes available. I can't see a
      way of doing this without spawning and then blocking a thread for each
      incoming call. That's too expensive in threads for me, so I've made
      pull() calls time out immediately if there is no event waiting. They
      throw TRANSIENT instead, which at least blocks the calling thread as it
      should (with omniORB4 at least).

In other news, all of these Proxy implementations are careful to send the
proper disconnect message to their peers when they are disconnected. They also
automatically disconnect when they receive an exception, which clears away
server resources when misbehaved clients just disappear without letting us know
they're going. This behaviour should probably be made a little more lenient
when the exception is a TRANSIENT.

Doxygen code documentation is included in the download. I find it enormously
helpful for finding my way round, so I thought I'd include it.

A test suite is also included. It's written in Python and requires omniORBPy.
The tests are all for standards compliance, there are no performance tests yet.

<end>
