Akshaay1 opened a new pull request, #40514:
URL: https://github.com/apache/beam/pull/40514

   ## Problem
   
   `WriteToFiles` fails to write output when the `file_naming` function places 
the final file under a subdirectory of `path` (e.g. `file_naming=lambda *args: 
"subdir/file.txt"`). The write silently produces no files instead of raising, 
because the rename error is caught and only logged at debug level.
   
   ## Root Cause
   
   `_MoveTempFilesIntoFinalDestinationFn.process()` in 
`sdks/python/apache_beam/io/fileio.py` calls 
`FileSystems.mkdirs(self.path.get())` before renaming temp files into their 
final location, but the actual rename targets are 
`FileSystems.join(self.path.get(), final_file_name)`, where `final_file_name` 
comes from the user-supplied `file_naming` function and can itself contain a 
subdirectory. Only the base `path` gets created, not the nested directory the 
final file actually lives in. On filesystems that require the destination 
directory to exist before a rename (e.g. the local filesystem, via 
`os.rename`), this raises an `IOError`/`BeamIOError` that's caught and logged 
at debug level, so the files are silently never written.
   
   ## Solution
   
   Compute the final destination paths first, then create the parent directory 
of each unique final destination (via `FileSystems.split`) before attempting 
the rename, instead of only creating the base path.
   
   ## Testing
   
   - Test added: `test_write_to_nested_directory_destination` in 
`sdks/python/apache_beam/io/fileio_test.py`, using a `file_naming` function 
that nests output under a `subdir/` directory and asserting all records are 
read back.
   - Tests run:
     - Confirmed the new test fails before the fix (`BeamAssertException: ... 
== [], missing elements [...]`, i.e. zero files were written to the 
subdirectory).
     - `pytest apache_beam/io/fileio_test.py::WriteFilesTest` — 8 passed, 1 
pre-existing skip, after the fix.
     - `pytest apache_beam/io/fileio_test.py` (full file) — 45 passed, 2 
pre-existing skips.
     - `yapf --diff` clean on both changed Python files.
   - Result: all pass.
   
   ## Related Issue
   
   Fixes #21313
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to