[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH OSSTEST v2] Arrange for core dumps to be placed in /var/core and collect them



Refactor the $kvp_replace helper in ts-xen-install into a generic
helper (which requires using ::EO and ::EI for namespacing) for use
with target_editfile and use it to edit /etc/sysctl.conf to set
kernel.core_pattern on boot.

Tested in standalone mode by installing and running a C program
containing "*(int *)0 = 1;" which, after running "ulimit -c unlimited"
produces the expected core file. ts-logs-capture when run in
standalone mode then picks them up.

I've not yet figured out how to make the desired rlimit take affect
for all processes (including e.g. daemons spawned on boot). Likely
this will involve some combination of pam_limits.so PAM module and
adding explicit ulimit calls to the initscripts which we care about
(primarily xencommons and libvirt initscripts).

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
v2: Add /var/core to ts-leak-check
---
 Osstest/TestSupport.pm | 22 ++++++++++++++++++++++
 ts-host-install        |  8 ++++++++
 ts-leak-check          |  2 +-
 ts-logs-capture        |  2 ++
 ts-xen-install         | 19 ++-----------------
 5 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/Osstest/TestSupport.pm b/Osstest/TestSupport.pm
index 8754e22..ece2282 100644
--- a/Osstest/TestSupport.pm
+++ b/Osstest/TestSupport.pm
@@ -57,6 +57,7 @@ BEGIN {
                       target_put_guest_image target_editfile
                       target_editfile_cancel
                       target_editfile_root target_file_exists
+                      target_editfile_kvp_replace
                       target_run_apt
                       target_install_packages target_install_packages_norec
                       target_jobdir target_extract_jobdistpath_subdir
@@ -542,6 +543,27 @@ sub teditfileex {
        if $install;
 }
 
+# Replace a Key=Value style line in a config file.
+#
+# To be used as 3rd argument to target_editfile(_root) as:
+#    target_editfile_root($ho, "/path/to/a/file",
+#                       sub { target_editfile_kvp_replace($key, $value) });
+sub target_editfile_kvp_replace ($$)
+{
+    my ($key,$value) = @_;
+    my $prnow;
+    $prnow= sub {
+       print ::EO "$key=$value\n" or die $!;
+       $prnow= sub { };
+    };
+    while (<::EI>) {
+       print ::EO or die $! unless m/^$key\b/;
+       $prnow->() if m/^#$key/;
+    }
+    print ::EO "\n" or die $!;
+    $prnow->();
+};
+
 sub target_editfile_root ($$$;$$) { teditfileex('root',@_); }
 sub target_editfile      ($$$;$$) { teditfileex('osstest',@_); }
     # my $code= pop @_;
diff --git a/ts-host-install b/ts-host-install
index 9656079..2e3e84b 100755
--- a/ts-host-install
+++ b/ts-host-install
@@ -139,6 +139,14 @@ END
        });
     }
 
+    target_cmd_root($ho, 'mkdir -p /var/core');
+    target_editfile_root($ho, '/etc/sysctl.conf',
+       sub { target_editfile_kvp_replace(
+                 "kernel.core_pattern",
+                 # %p==pid,%e==executable name,%t==timestamp
+                 "/var/core/%t.%p.%e.core") });
+    target_cmd_root($ho, "sysctl --load /etc/sysctl.conf");
+
     target_cmd_root($ho, "update-rc.d osstest-confirm-booted start 99 2 .");
 
     logm('OK: install completed');
diff --git a/ts-leak-check b/ts-leak-check
index ec40435..fdade36 100755
--- a/ts-leak-check
+++ b/ts-leak-check
@@ -157,7 +157,7 @@ sub inventory () {
     inventory_domains();
     inventory_processes();
     inventory_xenstore();
-    inventory_files('/tmp /var/run /var/tmp /var/lib/xen');
+    inventory_files('/tmp /var/run /var/tmp /var/lib/xen /var/core');
 }
 
 if (!eval {
diff --git a/ts-logs-capture b/ts-logs-capture
index 453b03d..45b0a38 100755
--- a/ts-logs-capture
+++ b/ts-logs-capture
@@ -136,6 +136,8 @@ sub fetch_logs_host_guests () {
 
                   /home/osstest/osstest-confirm-booted.log
 
+                  /var/core/*.core
+
                   )];
     if (!try_fetch_logs($ho, $logs)) {
         logm("log fetching failed, trying hard host reboot...");
diff --git a/ts-xen-install b/ts-xen-install
index b3f4387..2db0b29 100755
--- a/ts-xen-install
+++ b/ts-xen-install
@@ -116,26 +116,11 @@ sub adjustconfig () {
     }
     die unless defined $trace_config_file;
 
-    my $kvp_replace = sub($$) {
-       my ($key,$value) = @_;
-        my $prnow;
-        $prnow= sub {
-            print EO "$key=$value\n" or die $!;
-            $prnow= sub { };
-        };
-        while (<EI>) {
-            print EO or die $! unless m/^$key\b/;
-            $prnow->() if m/^#$key/;
-        }
-        print EO "\n" or die $!;
-        $prnow->();
-    };
-
     target_editfile_root($ho, $trace_config_file,
-                        sub { $kvp_replace->("XENCONSOLED_TRACE", "guest") });
+       sub { target_editfile_kvp_replace("XENCONSOLED_TRACE", "guest") });
 
     target_editfile_root($ho, '/etc/libvirt/libvirtd.conf',
-                        sub { $kvp_replace->("log_level", "1") })
+               sub { target_editfile_kvp_replace("log_level", "1") })
        if toolstack($ho)->{Name} eq "libvirt";
 
     target_cmd_root($ho, 'mkdir -p /var/log/xen/console');
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.