внутренняя модель перестроена вокруг аудиозаписи
- audiorecords вместо transcribe_jobs: приложения (texts, structures, recognitions, record_events, topics) живут своими коллекциями, ссылки на исходник и на приведённую копию перестали переставляться - рубеж называет достигнутое, отказ стал признаком остановки с причиной, а сторожей стало двое: число отказов и время в рубеже - воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/aws/smithy-go"
|
||||
)
|
||||
|
||||
@@ -89,6 +90,37 @@ func (s *yandexS3Service) uploadFile(ctx context.Context, file io.Reader, fileNa
|
||||
return nil
|
||||
}
|
||||
|
||||
// objectExists отвечает, лежит ли объект нужного размера.
|
||||
//
|
||||
// По нему шаг решает, повторять ли заливку: повтор её бесплатен, но дорог по
|
||||
// времени на многочасовой записи. Сверка идёт по присутствию и длине, а не по
|
||||
// отпечатку содержимого: признак целостности у составного объекта не равен
|
||||
// отпечатку, и сверка хешем расходилась бы на всякой большой записи.
|
||||
func (s *yandexS3Service) objectExists(ctx context.Context, objectKey string, size int64) (bool, error) {
|
||||
out, err := s.client.HeadObject(ctx, &s3.HeadObjectInput{
|
||||
Bucket: aws.String(s.bucketName),
|
||||
Key: aws.String(objectKey),
|
||||
})
|
||||
if err != nil {
|
||||
var notFound *s3types.NotFound
|
||||
if errors.As(err, ¬Found) {
|
||||
return false, nil
|
||||
}
|
||||
// Отказ SDK несёт полный URL объекта, а он — ключ к чужому аудио: наружу
|
||||
// идёт класс отказа и только он.
|
||||
var apiErr smithy.APIError
|
||||
if errors.As(err, &apiErr) {
|
||||
if apiErr.ErrorCode() == "NotFound" || apiErr.ErrorCode() == "NoSuchKey" {
|
||||
return false, nil
|
||||
}
|
||||
return false, fmt.Errorf("failed to head object in S3: %s", apiErr.ErrorCode())
|
||||
}
|
||||
return false, errors.New("failed to head object in S3")
|
||||
}
|
||||
|
||||
return out.ContentLength != nil && *out.ContentLength == size, nil
|
||||
}
|
||||
|
||||
func (s *yandexS3Service) fileUrl(fileName string) string {
|
||||
endpoint := strings.TrimRight(s.endpoint, "/")
|
||||
return fmt.Sprintf("%s/%s/%s", endpoint, s.bucketName, fileName)
|
||||
|
||||
Reference in New Issue
Block a user