Я думаю, что мое соединение для загрузки файлов закрывается ... почему? - PullRequest
0 голосов
/ 06 июля 2019

Отказ от ответственности: я не уверен, является ли название моей настоящей проблемой, но это единственная причина, которая имеет смысл для того, что ниже.

Сценарий

Я загружаю большие видео на мой сервер Golang.У меня есть файл 8 ГБ, который занимает около 15 минут локально и работает хорошо.Однако на моем промежуточном сервере (Google Cloud) загрузка этого файла занимает чуть более часа, и именно здесь возникает проблема.

Проблема

Мой клиент ожидает завершения загрузки файла, чтобы вызвать другую конечную точку API, но только на промежуточном сервере происходит сбой.Таким образом, похоже, что когда мой сервер пытается написать ответ, соединение не разрешает его, потому что клиент показывает ошибку 502 и ошибку CORS, что, как я знаю, является способом Chrome сказать: «Мы не знаемпроверь свой сервер ".

Код

Внутри моего SrcHandler есть такое:

defer func(begin time.Time) {
        pr, pw := io.Pipe()
        defer pw.Close()

        if err := r.ParseMultipartForm(32 << 20); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            fmt.Printf("%v\n", err)
            return
        }

        srcFile, handler, err := r.FormFile("video")
        if err != nil {
            http.Error(w, "INVALID_FILE", http.StatusBadRequest)
            return
        }
        defer srcFile.Close()

        // Copy uploaded file to *PipeWriter
        go func() {
            defer srcFile.Close()
            defer pw.Close()
            io.Copy(pw, srcFile)
        }()

        // Prep fileName
        var srcFileName = strings.Replace(handler.Filename, " ", "_", -1)
        var extension = filepath.Ext(srcFileName)
        srcFileName = srcFileName[0 : len(srcFileName)-len(extension)]

        // Create temp file to write too
        f, err := ioutil.TempFile("./tmp/pending", srcFileName+"_")
        if err != nil {
            log.Fatal(err)
        }
        defer f.Close()

        // Copy *PipeReader to temp file
        io.Copy(f, pr)

        contentType, err := getFileContentType("./" + f.Name())
        if err != nil {
            fmt.Printf("Content Type Error: %v\n", err)
            return
        }

        fmt.Printf("ContentType = %v\n ", contentType)
        if contentType != "video/x-flv" && contentType != "video/mp4" &&
            contentType != "video/quicktime" && contentType != "video/x-msvideo" &&
            contentType != "video/x-ms-wmv" && contentType != "video/webm" {
            http.Error(w, "INVALID_FILE_TYPE", http.StatusBadRequest)
            os.Remove(f.Name())
            return
        }

        fmt.Printf("Upload path -> %v\n", f.Name())
        upload := UploaderResponse{srcFileName, "./" + f.Name()}

        resp, err := json.Marshal(upload)
        if err != nil {
            fmt.Printf("Error using Marshal %v\n", err)
        }

        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusOK)

        status, err2 := w.Write(resp)
        if err2 != nil {
            fmt.Printf("Error when writing response to app %v\n", err2)
        } else {
            fmt.Printf("Status from uploading: %v\n", status)
        }

        _ = u.logger.Log("upload.Handler Duration ", time.Since(begin))

    }(time.Now())

Код доходит до последней строкиu.logger.Log(), который фактически показывает вывод.Таким образом, видео загружено правильно ... не отвечает только клиент.У кого-нибудь есть идеи?

Отказ от ответственности 2: Я только что обнаружил, что w.Write возвращает ошибку, поэтому я жду, пока файл завершит загрузку, чтобы посмотреть, не появятся ли сообщения об ошибках.Ответит обновлением.

Обновление 1

Я загрузил новый файл, и вызов w.Write() работает, возвращая 91 целое число.Я не уверен, что проблема может быть сейчас.Может ли это быть тайм-аут где-то, о чем я не знаю.К вашему сведению, время ожидания чтения и записи на моем сервере составляет 6 часов.

Если это поможет, вот журналы.Должно быть легко следовать коду с выходами: enter image description here

1 Ответ

0 голосов
/ 06 июля 2019

Я упоминал об истечении времени ожидания, но оказалось, что эта проблема не имеет ничего общего с кодом. Я наткнулся на другой ТАК пост , у которого была та же проблема, но вместо этого на AWS. Проблема была в таймауте от балансировщика нагрузки. Я использовал инструкции из Документов Google Cloud , чтобы увеличить время ожидания по умолчанию с 30 секунд до пары часов. Если быть точным, настройка тайм-аута - это подсчет того, как долго на сервере ждать отправки ответа клиенту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...