Author: amc
Date: Sun Aug 28 15:53:10 2011
New Revision: 1162544
URL: http://svn.apache.org/viewvc?rev=1162544&view=rev
Log:
TS-936: fixed core file generation on Linux
Modified:
trafficserver/traffic/trunk/CHANGES
trafficserver/traffic/trunk/lib/ts/ink_cap.cc
trafficserver/traffic/trunk/lib/ts/ink_cap.h
trafficserver/traffic/trunk/proxy/Main.cc
Modified: trafficserver/traffic/trunk/CHANGES
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/CHANGES?rev=1162544&r1=1162543&r2=1162544&view=diff
==============================================================================
--- trafficserver/traffic/trunk/CHANGES (original)
+++ trafficserver/traffic/trunk/CHANGES Sun Aug 28 15:53:10 2011
@@ -3,6 +3,8 @@ Changes with Apache Traffic Server 3.1.1
*) [TS-896] When logging config changes, we should check if it is remote
logging and clean up the collation client related data.
+ *) [TS-936] Fix problems with core file generation on Linux.
+
Changes with Apache Traffic Server 3.1.0
*) Make sure --enable-purify works again
Modified: trafficserver/traffic/trunk/lib/ts/ink_cap.cc
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/lib/ts/ink_cap.cc?rev=1162544&r1=1162543&r2=1162544&view=diff
==============================================================================
--- trafficserver/traffic/trunk/lib/ts/ink_cap.cc (original)
+++ trafficserver/traffic/trunk/lib/ts/ink_cap.cc Sun Aug 28 15:53:10 2011
@@ -41,7 +41,7 @@ DebugCapabilities(char const* tag) {
Debug(tag,
"uid=%u, gid=%u, euid=%u, egid=%u"
# if TS_USE_POSIX_CAP
- ", caps %s thread 0x%x"
+ ", caps %s core=%s thread=0x%x"
# endif
,static_cast<unsigned int>(getuid())
,static_cast<unsigned int>(getgid())
@@ -49,6 +49,7 @@ DebugCapabilities(char const* tag) {
,static_cast<unsigned int>(getegid())
# if TS_USE_POSIX_CAP
,caps_text
+ ,prctl(PR_GET_DUMPABLE) != 1 ? "disabled" : "enabled"
,pthread_self()
# endif
);
@@ -86,3 +87,18 @@ RestrictCapabilities() {
# endif
return zret;
}
+
+int
+EnableCoreFile(bool flag) {
+ int zret = 0;
+# if defined(linux)
+ int state = flag ? 1 : 0;
+ if (0 > (zret = prctl(PR_SET_DUMPABLE, state, 0, 0, 0))) {
+ Warning("Unable to set PR_DUMPABLE : %s", strerror(errno));
+ } else if (state != prctl(PR_GET_DUMPABLE)) {
+ zret = ENOSYS; // best guess
+ Warning("Call to set PR_DUMPABLE was ineffective");
+ }
+# endif // linux check
+ return zret;
+}
Modified: trafficserver/traffic/trunk/lib/ts/ink_cap.h
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/lib/ts/ink_cap.h?rev=1162544&r1=1162543&r2=1162544&view=diff
==============================================================================
--- trafficserver/traffic/trunk/lib/ts/ink_cap.h (original)
+++ trafficserver/traffic/trunk/lib/ts/ink_cap.h Sun Aug 28 15:53:10 2011
@@ -36,4 +36,12 @@ extern int PreserveCapabilities();
/// @return 0 on success, non-zero otherwise.
extern int RestrictCapabilities();
+/** Control generate of core file on crash.
+ @a flag sets whether core files are enabled on crash.
+ @return 0 on success, @c errno on failre.
+ */
+extern int EnableCoreFile(
+ bool flag ///< New enable state.
+);
+
#endif
Modified: trafficserver/traffic/trunk/proxy/Main.cc
URL:
http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/Main.cc?rev=1162544&r1=1162543&r2=1162544&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/Main.cc (original)
+++ trafficserver/traffic/trunk/proxy/Main.cc Sun Aug 28 15:53:10 2011
@@ -137,6 +137,7 @@ int http_accept_file_descriptor = NO_FD;
int ssl_accept_file_descriptor = NO_FD;
char accept_fd_list[1024] = "";
char core_file[255] = "";
+bool enable_core_file_p = false; // Enable core file dump?
int command_flag = DEFAULT_COMMAND_FLAG;
#if TS_HAS_TESTS
char regression_test[1024] = "";
@@ -950,15 +951,8 @@ set_core_size(const char *name, RecDataT
if (setrlimit(RLIMIT_CORE, &lim) < 0) {
failed = true;
}
-#if defined(linux)
-#ifndef PR_SET_DUMPABLE
-#define PR_SET_DUMPABLE 4
-#endif
- // bz57317
- if (size != 0)
- prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
-#endif // linux check
-
+ enable_core_file_p = size != 0;
+ EnableCoreFile(enable_core_file_p);
}
if (failed == true) {
@@ -1476,6 +1470,10 @@ change_uid_gid(const char *user)
}
}
xfree(buf);
+
+ // Ugly but this gets reset when the process user ID is changed so
+ // it must be udpated here.
+ EnableCoreFile(enable_core_file_p);
}
//