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);
 }
 
 //


Reply via email to