From 1b4daca45af82253934b9e5882ac76c8ca9bd546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E9=91=AB?= Date: Tue, 28 May 2024 04:04:04 +0000 Subject: [PATCH] Resolve DPISDN-34 "Feature " --- coredump-handler/coredump-handler.go | 90 ++++++++++++++-------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/coredump-handler/coredump-handler.go b/coredump-handler/coredump-handler.go index abca769..bbf072e 100644 --- a/coredump-handler/coredump-handler.go +++ b/coredump-handler/coredump-handler.go @@ -29,6 +29,7 @@ import ( ) var coredump_config types.Coredump_config +var percent int64 func argsJudge() error { @@ -57,32 +58,18 @@ func argsJudge() error { } // judge disk's space is sufficient or not -func isDiskSufficient(pipe_config types.Pipeconfig) (bool, error) { - percent, err := strconv.ParseInt(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 10, 32) - if err != nil { - return false, err - } +func isDiskSufficient(pipe_config types.Pipeconfig) (bool, string, error) { wd := pipe_config.Storage - if err != nil { - fmt.Println(err) - return false, err - } diskinfo, err := disk.Usage(wd) if err != nil { - return false, err - } - data, err := json.MarshalIndent(diskinfo, "", " ") - if err != nil { - info := fmt.Sprintf("diskinfo:%s", string(data)) - journal.Print(journal.PriInfo, info) + return false, "", err } usage := int64(math.Floor(diskinfo.UsedPercent + 0.5)) info := fmt.Sprintf("usage:%d,limited:%d", usage, percent) - journal.Print(journal.PriInfo, info) if usage >= percent { - return false, nil + return false, info, nil } - return true, nil + return true, info, nil } // create dir to storage coredump file and coredump info @@ -175,8 +162,7 @@ func writeCoreDumpToFile(config types.Coredump_config, pipe_config types.Pipecon return err } defer file.Close() - buf := make([]byte, 1024*1024) - nums := 0 + buf := make([]byte, 10*1024*1024) for { n, err := os.Stdin.Read(buf) if err != nil && err != io.EOF { @@ -189,25 +175,23 @@ func writeCoreDumpToFile(config types.Coredump_config, pipe_config types.Pipecon if err != nil { return err } - nums += 1 - if nums >= 10 { - flag, err := isDiskSufficient(pipe_config) - if err != nil { - journal.Print(journal.PriErr, "Can't judge disk's space is sufficient or not. "+err.Error()) - return err - } - if !flag { - return errors.New("Disk space exceeds limit when writing coredump!") - } - nums = 0 + flag, _, err := isDiskSufficient(pipe_config) + if err != nil { + journal.Print(journal.PriErr, "Can't judge disk's space is sufficient or not. "+err.Error()) + return err + } + if !flag { + return errors.New("Disk space exceeds limit when writing coredump!") } } return nil } + func HandleCrash(pid int, procfsDir string, mdFilename string) bool { journal.Print(journal.PriInfo, "start convert to minidump") return bool(C.HandleCrash(C.pid_t(pid), C.CString(procfsDir), C.CString(mdFilename))) } + func writeMiniDumpToFile(config types.Coredump_config) error { filename := fmt.Sprintf("%s/%s_%s_%d.minidump", config.Storage, config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) pid, err := strconv.Atoi(config.Initial_ns_pid) @@ -219,15 +203,9 @@ func writeMiniDumpToFile(config types.Coredump_config) error { return errors.New("can not convert to minidump") } journal.Print(journal.PriInfo, "end convert to minidump") - // cmd := exec.Command("/opt/tsg/coredump/bin/core_handler", config.Initial_ns_pid, filename) - // cmd.Stdin = os.Stdin - // output, err := cmd.Output() - // if err != nil { - // return err - // } - // fmt.Println(string(output)) return nil } + func compress(config types.Coredump_config) error { // Create a new zip archive. filename := fmt.Sprintf("%s_%s_%d.coredump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) @@ -274,9 +252,8 @@ func compress(config types.Coredump_config) error { return nil } -func main() { - info := fmt.Sprintf("start handle coredump") - journal.Print(journal.PriInfo, info) + +func init() { flag.StringVar(&coredump_config.Initial_ns_pid, "P", "", "initial ns pid") flag.StringVar(&coredump_config.Process_ns_pid, "p", "", "process ns pid") flag.StringVar(&coredump_config.Process_exe_path, "E", "", "pathname of executable process") @@ -285,13 +262,15 @@ func main() { flag.StringVar(&coredump_config.GID, "g", "", "Numeric real GID of dumped process.") flag.IntVar(&coredump_config.Signal, "s", -1, "Number of signal causing dump") flag.StringVar(&coredump_config.UID, "u", "", "Numeric real UID of dumped process.") - flag.Parse() +} + +func start() { var err error coredump_config.Hostname, err = os.Hostname() if err != nil { journal.Print(journal.PriErr, err.Error()) } - info = fmt.Sprintf("initialize command line parameters. -P=%s -p=%s -E=%s -C=%s -t=%d -g=%s -h=%s -s=%d -u=%s", coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Process_exe_path, coredump_config.Corepipe_config_path, coredump_config.Timestamp, coredump_config.GID, coredump_config.Hostname, coredump_config.Signal, coredump_config.UID) + info := fmt.Sprintf("initialize command line parameters. -P=%s -p=%s -E=%s -C=%s -t=%d -g=%s -h=%s -s=%d -u=%s", coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Process_exe_path, coredump_config.Corepipe_config_path, coredump_config.Timestamp, coredump_config.GID, coredump_config.Hostname, coredump_config.Signal, coredump_config.UID) journal.Print(journal.PriInfo, info) coredump_config.Process_exe_path = strings.Replace(coredump_config.Process_exe_path, "!", "/", -1) //Judge agrs is correct or not. @@ -316,12 +295,20 @@ func main() { return } } - //judge disk usage - flag, err := isDiskSufficient(pipe_config) + percent, err = strconv.ParseInt(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 10, 32) if err != nil { journal.Print(journal.PriErr, err.Error()) return } + //judge disk usage + flag, info, err := isDiskSufficient(pipe_config) + if err != nil { + journal.Print(journal.PriErr, err.Error()) + return + } + if info != "" { + journal.Print(journal.PriInfo, info) + } if !flag { journal.Print(journal.PriErr, "Disk space exceeds limit") return @@ -385,11 +372,14 @@ func main() { if err != nil { journal.Print(journal.PriErr, err.Error()) } - flag, err = isDiskSufficient(pipe_config) + flag, info, err = isDiskSufficient(pipe_config) if err != nil { journal.Print(journal.PriErr, "Can't judge disk's space is sufficient or not. "+err.Error()) return } + if info != "" { + journal.Print(journal.PriInfo, info) + } if !flag { journal.Print(journal.PriErr, "Disk space exceeds limit after write coredump!") err := os.RemoveAll(pipe_config.Storage) @@ -401,3 +391,11 @@ func main() { return } } + +func main() { + info := fmt.Sprintf("start handle coredump") + journal.Print(journal.PriInfo, info) + flag.Parse() + start() + journal.Print(journal.PriInfo, "finish to write coredump") +}