crash-reporter: send payload sizes to help diagnose corruption

Change-Id: Ia68990138ebcc3dd6d644fe30d0721dde41c567e

BUG=6299
TEST=UserCrash, CrashSender, KernelCrash

Review URL: http://codereview.chromium.org/3820004
diff --git a/crash_reporter/crash_collector.cc b/crash_reporter/crash_collector.cc
index e91f70a..0391fa5 100644
--- a/crash_reporter/crash_collector.cc
+++ b/crash_reporter/crash_collector.cc
@@ -248,7 +248,8 @@
 }
 
 void CrashCollector::WriteCrashMetaData(const FilePath &meta_path,
-                                        const std::string &exec_name) {
+                                        const std::string &exec_name,
+                                        const std::string &payload_path) {
   std::map<std::string, std::string> contents;
   if (!ReadKeyValueFile(FilePath(std::string(kLsbRelease)), '=', &contents)) {
     logger_->LogError("Problem parsing %s", kLsbRelease);
@@ -259,11 +260,15 @@
   if ((i = contents.find("CHROMEOS_RELEASE_VERSION")) != contents.end()) {
     version = i->second;
   }
+  int64 payload_size = -1;
+  file_util::GetFileSize(FilePath(payload_path), &payload_size);
   std::string meta_data = StringPrintf("exec_name=%s\n"
                                        "ver=%s\n"
+                                       "payload_size=%lld\n"
                                        "done=1\n",
                                        exec_name.c_str(),
-                                       version.c_str());
+                                       version.c_str(),
+                                       payload_size);
   if (!file_util::WriteFile(meta_path, meta_data.c_str(), meta_data.size())) {
     logger_->LogError("Unable to write %s", meta_path.value().c_str());
   }
diff --git a/crash_reporter/crash_collector.h b/crash_reporter/crash_collector.h
index 730a8e7..97bf0d6 100644
--- a/crash_reporter/crash_collector.h
+++ b/crash_reporter/crash_collector.h
@@ -89,7 +89,8 @@
 
   // Write a file of metadata about crash.
   void WriteCrashMetaData(const FilePath &meta_path,
-                          const std::string &exec_name);
+                          const std::string &exec_name,
+                          const std::string &payload_path);
 
   CountCrashFunction count_crash_function_;
   IsFeedbackAllowedFunction is_feedback_allowed_function_;
diff --git a/crash_reporter/crash_sender b/crash_reporter/crash_sender
index 244c31d..6849864 100644
--- a/crash_reporter/crash_sender
+++ b/crash_reporter/crash_sender
@@ -195,8 +195,10 @@
   local board="$(get_board)"
   local hwclass="$(get_hardware_class)"
   local payload_extension="${kind}"
+  local write_payload_size="$(get_key_value "${meta_path}" "payload_size")"
   [ "${kind}" = "minidump" ] && payload_extension="dmp"
   local report_payload="$(get_base "${meta_path}").${payload_extension}"
+  local send_payload_size="$(stat --printf=%s "${report_payload}")"
   lecho "Sending crash:"
   lecho "  Scheduled to send in ${sleep_time}s"
   lecho "  Metadata: ${meta_path} (${kind})"
@@ -236,6 +238,8 @@
     -F "board=${board}" \
     -F "hwclass=${hwclass}" \
     -F "exec_name=${exec_name}" \
+    -F "write_payload_size=${write_payload_size}" \
+    -F "send_payload_size=${send_payload_size}" \
     -F "guid=<${CONSENT_ID}" -o "${report_id}" 2>"${curl_stderr}"
   curl_result=$?
   set -e
diff --git a/crash_reporter/kernel_collector.cc b/crash_reporter/kernel_collector.cc
index f5e20b9..c6bb33f 100644
--- a/crash_reporter/kernel_collector.cc
+++ b/crash_reporter/kernel_collector.cc
@@ -104,7 +104,8 @@
     WriteCrashMetaData(
         root_crash_directory.Append(
             StringPrintf("%s.meta", dump_basename.c_str())),
-        kKernelExecName);
+        kKernelExecName,
+        kernel_crash_path.value());
 
     logger_->LogInfo("Collected kernel crash diagnostics into %s",
                      kernel_crash_path.value().c_str());
diff --git a/crash_reporter/user_collector.cc b/crash_reporter/user_collector.cc
index 18ab7b9..4047eb4 100644
--- a/crash_reporter/user_collector.cc
+++ b/crash_reporter/user_collector.cc
@@ -278,7 +278,8 @@
   WriteCrashMetaData(
       crash_path.Append(
           StringPrintf("%s.meta", dump_basename.c_str())),
-      exec_name);
+      exec_name,
+      minidump_path.value());
 
   if (conversion_result) {
     logger_->LogInfo("Stored minidump to %s", minidump_path.value().c_str());