aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dashboard/app/api.go34
-rw-r--r--dashboard/app/jobs.go12
2 files changed, 27 insertions, 19 deletions
diff --git a/dashboard/app/api.go b/dashboard/app/api.go
index 4375b19b5..eeb8cd565 100644
--- a/dashboard/app/api.go
+++ b/dashboard/app/api.go
@@ -530,7 +530,7 @@ func uploadBuild(c context.Context, now time.Time, ns string, req *dashapi.Build
if len(req.KernelCommit) > MaxStringLen {
return nil, false, fmt.Errorf("Build.KernelCommit is too long (%v)", len(req.KernelCommit))
}
- configID, err := putText(c, ns, textKernelConfig, req.KernelConfig, true)
+ configID, err := putText(c, ns, textKernelConfig, req.KernelConfig)
if err != nil {
return nil, false, err
}
@@ -942,22 +942,22 @@ func saveCrash(c context.Context, ns string, req *dashapi.Crash, bug *Bug, bugKe
},
}
var err error
- if crash.Log, err = putText(c, ns, textCrashLog, req.Log, false); err != nil {
+ if crash.Log, err = putText(c, ns, textCrashLog, req.Log); err != nil {
return err
}
- if crash.Report, err = putText(c, ns, textCrashReport, req.Report, false); err != nil {
+ if crash.Report, err = putText(c, ns, textCrashReport, req.Report); err != nil {
return err
}
- if crash.ReproSyz, err = putText(c, ns, textReproSyz, req.ReproSyz, false); err != nil {
+ if crash.ReproSyz, err = putText(c, ns, textReproSyz, req.ReproSyz); err != nil {
return err
}
- if crash.ReproC, err = putText(c, ns, textReproC, req.ReproC, false); err != nil {
+ if crash.ReproC, err = putText(c, ns, textReproC, req.ReproC); err != nil {
return err
}
- if crash.MachineInfo, err = putText(c, ns, textMachineInfo, req.MachineInfo, true); err != nil {
+ if crash.MachineInfo, err = putText(c, ns, textMachineInfo, req.MachineInfo); err != nil {
return err
}
- if crash.ReproLog, err = putText(c, ns, textReproLog, req.ReproLog, false); err != nil {
+ if crash.ReproLog, err = putText(c, ns, textReproLog, req.ReproLog); err != nil {
return err
}
crash.UpdateReportingPriority(c, build, bug)
@@ -1108,7 +1108,7 @@ func saveReproAttempt(c context.Context, bug *Bug, build *Build, log []byte) err
Manager: build.Manager,
}
var err error
- if entry.Log, err = putText(c, bug.Namespace, textReproLog, log, false); err != nil {
+ if entry.Log, err = putText(c, bug.Namespace, textReproLog, log); err != nil {
return err
}
if len(deleteKeys) > 0 {
@@ -1551,7 +1551,12 @@ func needReproForBug(c context.Context, bug *Bug) bool {
return timeSince(c, bug.LastReproTime) >= reproStalePeriod
}
-func putText(c context.Context, ns, tag string, data []byte, dedup bool) (int64, error) {
+var dedupTextFor = map[string]bool{
+ textKernelConfig: true,
+ textMachineInfo: true,
+}
+
+func putText(c context.Context, ns, tag string, data []byte) (int64, error) {
if ns == "" {
return 0, fmt.Errorf("putting text outside of namespace")
}
@@ -1561,7 +1566,7 @@ func putText(c context.Context, ns, tag string, data []byte, dedup bool) (int64,
const (
// Kernel crash log is capped at ~1MB, but vm.Diagnose can add more.
// These text files usually compress very well.
- maxTextLen = 10 << 20
+ maxTextLen = 10 << 20 // 10 MB
maxCompressedLen = 1000 << 10 // datastore entity limit is 1MB
)
if len(data) > maxTextLen {
@@ -1575,11 +1580,14 @@ func putText(c context.Context, ns, tag string, data []byte, dedup bool) (int64,
if len(b.Bytes()) < maxCompressedLen {
break
}
- data = data[:len(data)/10*9]
+ // For crash logs, it's better to preserve the end of the log - that is,
+ // where the panic message resides.
+ // Other types of data are not really assumed to be larger than 1MB compressed.
+ data = data[len(data)/10:]
b.Reset()
}
var key *db.Key
- if dedup {
+ if dedupTextFor[tag] {
h := hash.Hash([]byte(ns), b.Bytes())
key = db.NewKey(c, tag, "", h.Truncate64(), nil)
} else {
@@ -1809,7 +1817,7 @@ func logToReproForBug(c context.Context, bug *Bug, manager string) (*dashapi.Log
}
func saveReproTask(c context.Context, ns, manager string, repro []byte) error {
- log, err := putText(c, ns, textCrashLog, repro, false)
+ log, err := putText(c, ns, textCrashLog, repro)
if err != nil {
return err
}
diff --git a/dashboard/app/jobs.go b/dashboard/app/jobs.go
index 0c3c986bf..6ac0ca322 100644
--- a/dashboard/app/jobs.go
+++ b/dashboard/app/jobs.go
@@ -109,7 +109,7 @@ func addTestJob(c context.Context, args *testJobArgs) (*Job, *db.Key, error) {
args.repo != mgrConfig.RestrictedTestingRepo {
return nil, nil, &BadTestRequestError{mgrConfig.RestrictedTestingReason}
}
- patchID, err := putText(c, args.bug.Namespace, textPatch, args.patch, false)
+ patchID, err := putText(c, args.bug.Namespace, textPatch, args.patch)
if err != nil {
return nil, nil, err
}
@@ -120,7 +120,7 @@ func addTestJob(c context.Context, args *testJobArgs) (*Job, *db.Key, error) {
return nil, nil, err
}
configRef, err = putText(c, args.bug.Namespace, textKernelConfig,
- append(kernelConfig, []byte(args.configAppend)...), true)
+ append(kernelConfig, []byte(args.configAppend)...))
if err != nil {
return nil, nil, err
}
@@ -1073,16 +1073,16 @@ func doneJob(c context.Context, req *dashapi.JobDoneReq) error {
log.Errorf(c, "job %v: duplicate build %v", jobID, req.Build.ID)
}
}
- if job.Log, err = putText(c, ns, textLog, req.Log, false); err != nil {
+ if job.Log, err = putText(c, ns, textLog, req.Log); err != nil {
return err
}
- if job.Error, err = putText(c, ns, textError, req.Error, false); err != nil {
+ if job.Error, err = putText(c, ns, textError, req.Error); err != nil {
return err
}
- if job.CrashLog, err = putText(c, ns, textCrashLog, req.CrashLog, false); err != nil {
+ if job.CrashLog, err = putText(c, ns, textCrashLog, req.CrashLog); err != nil {
return err
}
- if job.CrashReport, err = putText(c, ns, textCrashReport, req.CrashReport, false); err != nil {
+ if job.CrashReport, err = putText(c, ns, textCrashReport, req.CrashReport); err != nil {
return err
}
for _, com := range req.Commits {