@@ -152,30 +152,40 @@ class TArrowFileFetcher : public NActors::TActorBootstrapped<TArrowFileFetcher>
152152 // Cutting file
153153
154154 TMaybe<TString> DecompressFile (const TString& data, const TRequest& request, const NActors::TActorContext& ctx) {
155- auto dataBuffer = NDB::ReadBufferFromString (data);
156- auto decompressorBuffer = NYql::MakeDecompressor (dataBuffer, *DecompressionFormat_);
157- if (!decompressorBuffer) {
158- auto error = MakeError (
155+ try {
156+ auto dataBuffer = NDB::ReadBufferFromString (data);
157+ auto decompressorBuffer = NYql::MakeDecompressor (dataBuffer, *DecompressionFormat_);
158+ if (!decompressorBuffer) {
159+ auto error = MakeError (
160+ request.Path ,
161+ NFq::TIssuesIds::INTERNAL_ERROR,
162+ TStringBuilder{} << " unknown compression: " << *DecompressionFormat_ << " . Use one of: gzip, zstd, lz4, brotli, bzip2, xz"
163+ );
164+ SendError (ctx, error);
165+ return {};
166+ }
167+
168+ TStringBuilder decompressedData;
169+ while (!decompressorBuffer->eof () && decompressedData.size () < 10_MB) {
170+ decompressorBuffer->nextIfAtEnd ();
171+ size_t maxDecompressedChunkSize = std::min (
172+ decompressorBuffer->available (),
173+ 10_MB - decompressedData.size ()
174+ );
175+ TString decompressedChunk{maxDecompressedChunkSize, ' ' };
176+ decompressorBuffer->read (&decompressedChunk.front (), maxDecompressedChunkSize);
177+ decompressedData << decompressedChunk;
178+ }
179+ return std::move (decompressedData);
180+ } catch (const yexception& error) {
181+ auto errorEv = MakeError (
159182 request.Path ,
160183 NFq::TIssuesIds::INTERNAL_ERROR,
161- TStringBuilder{} << " invalid decompression format: " << *DecompressionFormat_
184+ TStringBuilder{} << " couldn't decompress file, check format and compression params : " << error. AsStrBuf ()
162185 );
163- SendError (ctx, error );
186+ SendError (ctx, errorEv );
164187 return {};
165188 }
166-
167- TString decompressedData;
168- while (!decompressorBuffer->eof () && decompressedData.size () < 10_MB) {
169- decompressorBuffer->nextIfAtEnd ();
170- size_t maxDecompressedChunkSize = std::min (
171- decompressorBuffer->available (),
172- 10_MB - decompressedData.size ()
173- );
174- TString decompressedChunk{maxDecompressedChunkSize, ' ' };
175- decompressorBuffer->read (&decompressedChunk.front (), maxDecompressedChunkSize);
176- decompressedData += decompressedChunk;
177- }
178- return std::move (decompressedData);
179189 }
180190
181191 std::shared_ptr<arrow::io::RandomAccessFile> CleanupCsvFile (const TString& data, const TRequest& request, const arrow::csv::ParseOptions& options, const NActors::TActorContext& ctx) {
0 commit comments