[ace-users] HP-UX Itanium: TCP/IP connections stay in
CLOSE_WAIT state.
Douglas C. Schmidt
schmidt at dre.vanderbilt.edu
Thu Jun 14 09:34:27 CDT 2007
Hi John,
Thanks for using the PRF.
> ACE VERSION 5.4 and 5.5
Please upgrade to ACE+TAO+CIAO x.5.8 (i.e., ACE 5.5.8, TAO 1.5.8, and
CIAO 0.5.8), which you can download from
http://download.dre.vanderbilt.edu
under the heading: "Latest Beta Kit".
The DOC groups at Washington University, UC Irvine, and Vanderbilt
University only provide "best effort" support for non-sponsors for the
latest release, as described in
http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/docs/ACE-bug-process.html
Thus, if you need more "predictable" help for earlier versions of
ACE+TAO, I recommend that you check out
http://www.dre.vanderbilt.edu/support.html
for a list of companies that will provide you with ACE+TAO commercial
support.
Thanks,
Doug
> HOST MACHINE and OPERATING SYSTEM
> HP HP-UX 11.23 on Itanium Platform (HP-UX B.11.23 U ia64)
>
> Compiler GCC 4.0.2 (With patches suplied by HP for wstring support)
>
> $ACE_ROOT/ace/config.h:
> #ifndef ACE_CONFIG_H
> // ACE_CONFIG_H is defined in the included header
>
> #undef ACE_BUILD_DLL
> #ifndef ACE_AS_STATIC_LIBS
> #define ACE_AS_STATIC_LIBS
> #endif
>
> #ifndef HPUX_VERS
> #define HPUX_VERS 1123
> #endif
>
> #ifndef ACE_HAS_THREADS
> #define ACE_HAS_THREADS 1
> #endif
>
> #ifndef _POSIX_C_SOURCE
> #define _POSIX_C_SOURCE 199506L
> #endif
>
> #ifndef ACE_HAS_EXCEPTIONS
> #define ACE_HAS_EXCEPTIONS
> #endif
>
> #ifndef __ACE_INLINE__
> #define __ACE_INLINE__
> #endif
>
> #include <ace/config-hpux-11.00.h>
>
> #endif // ACE_CONFIG_H
>
> $ACE_ROOT/include/makeinclude/platform_macros.GNU:
> static_libs_only = 1
> CPPFLAGS += -fPIC
> include $(ACE_ROOT)/include/makeinclude/platform_hpux_gcc.GNU
>
> THE PROBLEM AFFECTS: EXECUTION
>
> SYNOPSIS:
> TCP/IP connections stay in CLOSE_WAIT state.
>
> DESCRIPTION:
> We implemented a server using the ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>. The implementation works fine on
> different platforms, but on itanium, connections closed by the client stay in the CLOSE_WAIT state (netstat). Every closed
> connection adds a new CLOSE_WAIT. Resources are limited, so after some time we are forced to restart the server.
>
> Our analysis:
>
> Normal behaviour:
>
> Svc_Handler.cpp
> ::operator new gets a dynamic_instance by calling ACE_Dynamic::instance()
> and calls set() upon the dynamic_instance and thereby setting its value to 1
>
> The ACE_Svc_Handler constructor assigns the value
> ACE_Dynamic::instance ()->is_dynamic () to the dynamic_ data member of this
> ACE_Svc_Handler.
>
> The ACE_Svc_Handler::destroy() method checks the ACE_Svc_Handler::dynamic_
> data member and deletes this ACE_Svc_Handler in case it has value 1
>
> But in case of the itanium:
>
> The call ACE_Dynamic::instance() in the ACE_Svc_Handler constructor creates
> a new instance in stead of using the instance initialized in the
> ::operator new. So, the dynamic_
> member gets a value 0. And this prevents the destroy method calling delete.
> And now the TCP/IP handle is not closed, resulting in a CLOSE_WAIT.
>
> It looks like the ACE_Dynamic::instance implemented with a ACE_TSS_Singleton
> does not work correctly.
>
> REPEAT BY:
> I added print statements printing the address of the dynamic instance in ace/Dynamic.i and ace/Svc_Handler.cpp. This
> shows the problem in the ace/tests/Svc_Handler_Test.cpp for ACE 5.4
>
> Index: Dynamic.i
> ===================================================================
> --- Dynamic.i (revision 19207)
> +++ Dynamic.i (working copy)
> @@ -3,10 +3,13 @@
>
> // Dynamic.i
>
> +#include <iostream>
> +
> ACE_INLINE
> ACE_Dynamic::~ACE_Dynamic (void)
> {
> // ACE_TRACE ("ACE_Dynamic::~ACE_Dynamic");
> + std::cout << this << " ACE_Dynamic::~ACE_Dynamic" << std::endl;
> }
>
> ACE_INLINE void
> @@ -14,12 +17,14 @@
> {
> // ACE_TRACE ("ACE_Dynamic::set");
> this->is_dynamic_ = 1;
> + std::cout << this << " ACE_Dynamic::set" << std::endl;
> }
>
> ACE_INLINE int
> ACE_Dynamic::is_dynamic ()
> {
> // ACE_TRACE ("ACE_Dynamic::is_dynamic");
> + std::cout << this << " ACE_Dynamic::is_dynamic " << this->is_dynamic_ << std::endl;
> return this->is_dynamic_;
> }
>
> @@ -28,4 +33,5 @@
> {
> // ACE_TRACE ("ACE_Dynamic::reset");
> this->is_dynamic_ = 0;
> + std::cout << this << " ACE_Dynamic::reset" << std::endl;
> }
>
> Index: Svc_Handler.cpp
> ===================================================================
> --- Svc_Handler.cpp (revision 19207)
> +++ Svc_Handler.cpp (working copy)
> @@ -15,6 +15,8 @@
>
> #include "ace/Dynamic.h"
>
> +#include "iostream"
> +
> ACE_RCSID(ace, Svc_Handler, "Svc_Handler.cpp,v 4.69 2004/01/05 22:57:06 shuston Exp")
>
> #define PR_ST_1 ACE_PEER_STREAM_1
> @@ -44,6 +46,7 @@
> ACE_TRACE ("ACE_Svc_Handler<PR_ST_2, ACE_SYNCH_USE>::operator new");
>
> ACE_Dynamic *const dynamic_instance = ACE_Dynamic::instance ();
> + std::cout << "new: dynamic_instance = "<< dynamic_instance << std::endl;
>
> if (dynamic_instance == 0)
> {
> @@ -72,6 +75,7 @@
> ACE_TRACE ("ACE_Svc_Handler<PR_ST_2, ACE_SYNCH_USE>::operator new(nothrow)");
>
> ACE_Dynamic *const dynamic_instance = ACE_Dynamic::instance ();
> + std::cout << "new2: dynamic_instance = "<< dynamic_instance << std::endl;
>
> if (dynamic_instance == 0)
> {
> @@ -100,12 +104,15 @@
>
> // Only delete ourselves if we're not owned by a module and have
> // been allocated dynamically.
> + std::cout << "destroy: dynamic_ = " << this->dynamic_ << std::endl;
> if (this->mod_ == 0 && this->dynamic_ && this->closing_ == 0)
> + {
> // Will call the destructor, which automatically calls <shutdown>.
> // Note that if we are *not* allocated dynamically then the
> // destructor will call <shutdown> automatically when it gets run
> // during cleanup.
> delete this;
> + }
> }
>
> template <PR_ST_1, ACE_SYNCH_DECL> void
> @@ -142,10 +149,13 @@
> // work correctly in multi-threaded programs by using our ACE_TSS
> // class.
> this->dynamic_ = ACE_Dynamic::instance ()->is_dynamic ();
> + std::cout << "construct: dynamic_ = " << this->dynamic_ << std::endl;
>
> if (this->dynamic_ != 0)
> + {
> // Make sure to reset the flag.
> ACE_Dynamic::instance ()->reset ();
> + }
> }
>
> // Default behavior for a ACE_Svc_Handler object is to be registered
>
> Kind regards,
>
> John Jenniskens
>
> _______________________________________________
> ace-users mailing list
> ace-users at mail.cse.wustl.edu
> http://mail.cse.wustl.edu/mailman/listinfo/ace-users
More information about the Ace-users
mailing list