summaryrefslogtreecommitdiff
path: root/TAO/docs/releasenotes/orbcore.html
blob: fe09fb039d6b12d1730b204e232672422354f964 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>ORB Core Status</title>
<!-- $Id$ -->
</head>
<body text="#000000" bgcolor="#FFFFFF">

<!-- *********************************** -->
<a name="toc"><h2>Table of Contents</h2></a>
<ul>
  <li><a href="#current">Current Status</a>
  <li><a href="#issues">Known Issues</a>
  <li><a href="#ongoing">Ongoing work</a>
  <li><a href="#future">Future Work</a>
  <li><a href="#completed">Completed Work</a>
</ul>
<!-- *********************************** -->

<hr>
<center>
<h1> <a name="orb"></a>ORB &amp; ORB Core</h1>

Point of contact: <a href="mailto: irfan@cs.wustl.edu">Irfan Pyarali</a>

<p>Last Update: $Date$</p>
</center>

<!-- ============================================================ -->
<a name="current"><h3>Current status:</h3></a>

<ul>
  <li><p>Trying to figure out a better <em>resource</em> management
          scheme.  <em>Resouces</em> here include ORB, POA, connections,
          profiles.... that provide services for CORBA invocations.
        </p>
        <P>[STATUS]: The current version keeps very few objects
          managed by the resource factory. Most are ORB specific. It
          seems like the correct implementation is to make the few
          remaining resources (such as the Reactor) a
          per-ORB-per-thread entity.
        </P>
  </li>
</ul>

<!-- --------------------- -->
<a href="#toc">Back to TOC</a>
<!-- --------------------- -->

<!-- ============================================================ -->
<a name="issues"><h3>Known issues:</h3></a>

<ul>
  <li><p>When using the thread-per-connection concurrency model, if
      some client leave the socket connection open without sending any
      request, the server will crash on NT.  This is because we are
      doing a blocking recv when a server connection handler acts as
      an active object, and the recv won't break out until the process
      gets kill by the OS.  This is especially a problem on NT because
      on shutdown, NT close down the socket service, which cause the
      blocking recv to unblock at which point, these threads try to
      access the already destroyed ORB resources.  A temporary
      workaround is to close the sockets when the ORB is shutting
      down.  But this is not portable and only works on NT.</p>
  </li>

  <li><p>Object references for objects dynamically created within a
      server may not have proper host. When an object is dynamically
      created and its object reference returned, it simply has to
      "guess" at the host information that is returned in the IIOP
      Profile.  Currently, it guesses using the host name, which is a
      reasonable guess in most cases.  However, if there are multiple
      interfaces on a machine <em>and</em> they have different host
      names, it is possible that the desired effect will not be
      realized, i.e., the connection to that new object may use a
      different interface from the original object. Currently the only
      way to change this is to use the <A
      HREF="../Options.html#-ORBEndpoint"><b>-ORBEndpoint</b> option</a> to
      manually specify that dynamically-created objects bind to a
      specific interface so that their IIOP Profile has the desired
      hostname. A more desirable fix is being investigated.</p>
  </li>
</ul>
<!-- --------------------- -->
<a href="#toc">Back to TOC</a>
<!-- --------------------- -->

<!-- ============================================================ -->
<a name="ongoing"><h3>Ongoing Work:</h3></a>

<ul>
  <li><p>ORB Core overhaul.</p>
  </li>

  <li><p>Support new concurrency models, e.g., Thread-per-Request,
      thread pool, etc..</p>
  </li>

  <li><p>Robustness improvements to connection cache so that it
      wont crash when there are no more slots or sockets.</p>
  </li>
      
</ul>
<!-- --------------------- -->
<a href="#toc">Back to TOC</a>
<!-- --------------------- -->

<!-- ============================================================ -->
<a name="future"><h3>Future work:</h3></a>

<ul>
  <li>Performance optimizations, such as:</li>
      <ol>
        <li><p>Replace all uses of <code>new</code> and <code>delete</code>
            with allocators that can be put into TSS. The main
            motivation for this is to eliminate lock contention when
            multiple threads need to allocate/deallocate memory,
            however it might also be possible to substitute an
            allocator better-tuned to an application's specific
            usage.</p>
        </li>
      </ol>

  <li>New features:</li>
      <ol>
        <li><p>Implement <code>RT-CORBA</code> spec. once it passes
            OMG member vote.</p>
        </li>

        <li><p>Added support for CORBA Messaging Spec.</p>
        </li>

        <li><p>According to tentative CORBA 2.3a spec, once
            ORB::shutdown has been called, operation invocations on
            object references obtained from this ORB must throw an
            <code>BAD_INV_ORDER</code> exception.</p>
        </li>
      </ol>

  <li>Internal restructuring:</li>
      <ol>
        <li><p>Create some sort of internal "request" object which
            carries enough context to suport deferred method
            invocation such as one might find in the thread-pool
            approach or wherever queuing might occur.</p>
        </li>
      </ol>

  <li>Documentation:</li>
    <ol>
        <li><p>Writing up ORB restructuring notes.</p>
        </li>
      </ol>

  <li>Potential Optimizations:</li>

      <ol>
        <li><p>There is a certain amount of overhead introduced by the
            use of TSS Singletons. TSS singletons are very convenient
            as the variable does not have to be passed from function
            to function. Even though sort of access is generally
            acceptable, the overhead of this approach maybe too high
            when used in code which is executed frequently (e.g.,
            during an upcall). This critical code may have to be
            restructured not to use TSS Singletons because of the high
            overhead associated with it.</p>
        </li>
      </ol>
</ul>
<!-- --------------------- -->
<a href="#toc">Back to TOC</a>
<!-- --------------------- -->

<!-- ============================================================ -->
<a name="completed"><h3>Completed Work:</h3></a>

<!-- ************************************************************ -->
<!-- Please make sure you append new items at the end of the list -->
<!-- ************************************************************ -->
<ul>
  <li><p><code>TAO_ORB_Core_instance()</code> returns the orb core
      of the default orb (the first orb created by the user).  This
      may not be the orb that the user is interested in.  The better
      approach is <code>myorb->orb_core()</code>.</p>
  </li>

  <li><p>Added an optional argument to resolve_initial_references()
      that allows the user to specify a timeout (an upper bound
      on the time-to-wait for a response from the ORB's multicast
      "search" for a running server). If no timeout value is
      specified by the user,
      <code>TAO_DEFAULT_SERVICE_RESOLUTION_TIMEOUT</code> is
      used.</p>
  </li>

  <li><p><code>ORB::perform_work</code> and
      <code>ORB::work_pending</code> are now implemented.
      <code>ORB::work_pending</code> may need some additional work
      in the future (since it currently always returns true).</p>
  </li>

  <li><p>Provides dynamically linked wholesale assignment of ORB
      strategies for communication, concurrency, demultiplexing,
      scheduling, and dispatching using the ACE Service Configurator
      framework.</p>
  </li>

  <li><p>Supports several concurrency models out of the box: Reactive,
      Thread-per-Connection, and ORB-per-thread. The ORB-per-thread
      design is optimized for real-time I/O subsystems. (See: <A
      HREF="../configurations.html">Configuration Guide</a>.)</p>
  </li>

  <li><p>Supports <code>resolve_initial_references("&lt;CORBA
      Service>")</code> using ACE support for multicast. <em>(TAO
      proprietary.)</em></p>
  </li>

  <li><p>Support both native C++ exceptions and
      <code>CORBA::Environment</code> based exceptions handling.</p>

  <li><p>Support for TAO proprietary <code>-ORBgioplite</code>
      command-line option.  When this option is enabled the ORB
      removes a few fields of the GIOP messages that are normally not
      used, such as the version numbers, the magic 'GIOP' string, the
      service context, the Principal object, etc. This option give us
      a slight performance improvement but it is important for
      extremely low-latency systems (such as avionics), that
      fortunately have tightly controlled environments so this kind of
      optimization is safe to use.</p>
  </li>

  <li><p>The buffers for outgoing CDR streams are allocated from TSS
      memory pools, reducing locking on the critical path.</p>
  </li>

  <li><p>Several optimizations on the critical path have been
      implemented, carefully removing excesive locking, memory
      allocations and data copying. In some cases special demarshaling
      and marshaling functions where written for the request
      headers.</p>
  </li>

  <li><p>Adding a new option into TAO_Resource_Factory to control the
      internal lock used by ORB's reacotr. With "<code>-ORBreactorlock
      null</code>" added into <code>svc.conf</code>, you can eliminate
      the token inside the Select_Reactor inside the ORB even on
      multi-threaded platforms. This eliminate some overheads caused
      by synchronizing access to the Select_Reactor. Usually, if you
      have TSS ORB and are using reactive concurrency startegy, the
      ORB are not accessed by multiple threads, then, you can safely
      turn the lock off.</p>
  </li>

  <li><p>Strategized the connection management scheme so that we don't
      always have to pay the price of a look up in the connection
      cache. Basically, we "hold" a service handler for a string of
      requests.</p>
  </li>

  <li><p>There is no need to call ORB::open if the port is 0. It will
      automatically be called when the first stub is created.</p>
  </li>

  <li><p>The ORB now handles nested upcalls correctly. See <a
      href="../leader_follower.html">this </a>for details on the
      design of the solution.</p>
  </li>

  <li><p>Added optimization for collocated objects. This optimization
      enables TAO to bypass communication layers and talks to
      collocated objects directly.</p>
  </li>

  <li><p>Making the collocation table configurable. We can either use
      a global collocation table to share objects among ORBs, or use
      the per-ORB collocation table.</p>
  </li>

  <li><p>Implement the inheritance mechanism in
      Default_Server_Connection_Handler to access the parent's
      POA. This is necessary when we are using thread-per-connection
      concurrency model.</p>
  </li>

  <li><p>It is often desireable for a server to start up and not have
      to specify the TCP port number on which the ORB will listen,
      i.e., let the OS decide.  While this works properly (by
      providing an argument such as
      `<code>-ORBEndpoint iiop://localhost:0</code>'), the actual port
      number used by the server won't be available after the server
      starts listening. TAO now tries to bind the address when a port
      set to zero is issued so it can get the actual address to publish
      the IOR for clients' use.</p>
  </li>

  <li><p>Broke the tight coupling between <code>CORBA_Object</code>
      and <code>IIOP_Object</code> so that multiple
      <code>CORBA_Object</code>s can share a single
      <code>IIOP_Object</code>. This has a big win in
      <code>_narrow</code> operations.</p>
  </li>

  <li><p>The ORBs manipulation of object keys and object ids is now
      consistent. Canonically, everything is managed as an opaque
      sequence of octets. Conversion to/from strings is permitted,
      with non-printables turning into a trigraph <b>\hl</b> where
      <b>h</b> is the high nibble digit in hex, and <b>l</b> is the
      low nibble in hex.</p>
  </li>

  <li><p><code>CORBA::ORB::run()</code> should be able to be called
      multiply in the same execution path now.</p>
  </li>

  <li><p>Fixed the <b>LOCATION_FORWARD</b> capabilities to work as
      described in the CORBA 2.1 and the POA specification.</p>
  </li>

  <li><p>Support for <b><a
      href="../Options.html#-ORBSndSock">-ORBSndSock</a></b> and <b><a
      href="../Options.html#-ORBRcvSock">-ORBRcvSock</a></b> ORB
      options. See <a href="../Options.html">options documentation</a>
      for details.</p>
  </li>

  <li><p>Support for connections pre-establishment using the <b><a
      href="../Options.html#-ORBPreconnect">-ORBPreconnect</a></b>
      option. This allows connections to be established before any
      CORBA requests are made. See <a href="../Options.html">options
      documentation</a> for details.</p>
  </li>

  <li><p>Placed an optimization in IIOP::Profile that should speed up
      invocations on the client side rather substantially. This was
      done by caching an instance of <code>ACE_INET_Addr</code> in the
      private portion of <code>Profile</code> because the cost of
      constructing one for every invocation (in
      <code>TAO_GIOP_Invocation::start</code>) was simply
      enormous--the construction was something like 100 cycles on
      Solaris. This is all because deep down this ends up calling
      <code>gethostbyname()</code>, which can be very costly. Of
      course, this is platform-dependent, so the improvements may not
      be as great on a different platform.</p>
  </li>

  <li><p>Eliminated need for <code>CORBA::Object</code> to keep a
      pointer to its orb sitting around anywhere.</p>
  </li>

  <li><p>Tested <code>CORBA_ORB::shutdown()</code> as a manner in
      which a thread of control can request that
      <code>CORBA_ORB::run()</code> should return and no longer
      service requests. It only honors a <em>wait_for_completion</em>
      argument of <b>FALSE</b> right now because we haven't fully
      explored the issues which surround doing all the completion.</p>
  </li>

  <li><p>Implemented <code>CORBA_ORB::shutdown()</code> as a manner in
      which a thread of control can request that
      <code>CORBA_ORB::run()</code> should return and no longer
      service requests.</p>
  </li>

  <li><p>Support for the -ORBInitRef option. This allows run-time
      specification of an ObjectId&lt;-&gt;IOR mapping. It is used by
      resolve_initial_references() and overrides the ORB install-time
      defaults.</p>
  </li>

  <li><p>minimal support for CORBA Contexts. This is an inherently
      un-typesafe feature, and many believe it will disappear from
      CORBA eventually, but in order to make _create_request()
      compliant, we have added a CORBA_Context class. The only
      permissible value for a Context pointer passed as an argument to
      _create_request is 0. If a non-zero pointer is passed, a
      NO_IMPLEMENT exception is raised.</p>
  </li>

  <li><p>Support configuring TAO's component as both static and
      dynamic services.   Improve robustness of setting default
      svc.conf entries.  See <a
      href="../configurations.html#programming">Configuration
      Document</a> for details.</p>
  </li>

  <li><p>TAO now understands <a
      href="index.html#nservices">Interoperable Naming Service</a>'s
      <code>iioploc://</code> and <code>iiopname://</code>
      formats.</p>
  </li>

  <li><p>Added Vendor ID and TAO-specific information to
     the <code>CORBA_SystemException</code> minor status component.
     The TAO-specific information currently consists of location
     (in the TAO source code) and errno indications.  See
     <a href="../tao/corbafwd.h"><code>tao/corbafwd.h</code></a>
     for values.  <code>CORBA_SystemException::print_exception_tao_ ()</code>
     should be used to print system exceptions.  If a known (expected)
     errno had been received, then it is printed.  Otherwise, the low
     7 bits of the errno are printed (in decimal).  They can be a bit
     tricky to interpret, for example, because it might have been generated
     on the server.  We only maintain the low 7 bits because of size
     restrictions on the minor status component.</p>
  </li>

  <li><p>The <CODE>CORBA::ORB_init()</CODE> function returns the same
          ORB if it is called twice with the same ORBid parameter or
          if the "-ORBid value" option is present in the argv-list.
          Please consult the CORBA specification for more details.
        </p>
  </li>

  <li><p>We implemented <CODE>GIOP 1.1</CODE>, including the support
          for tagged components in IIOP profiles.
        </p>
  </li>

  <li><p>Added CORBA compliant collocated stubs implementation.  The new
      implementation now query POA for permission to proceed thus fixed
      many potentially subtle problems.  The original collocation implementation
      is still supported using by specifying the -ORBCollocationStrategy direct
      command option (because the original scheme has slightly less method
      invocation overhead.)</p>
  </li>

  <li><p>
      Implemented CORBA::ORB::destroy() method.  See the CORBA 2.3a
      specification for details about this method.
      </p>
  </li>

</ul>
<!-- --------------------- -->
<a href="#toc">Back to TOC</a>
<!-- --------------------- -->

</BODY>
</HTML>