Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix modified_time on Android #103080

Merged
merged 1 commit into from
Feb 20, 2025
Merged

Conversation

Alex2782
Copy link
Member

@Alex2782 Alex2782 commented Feb 20, 2025

Fixes: #101007 (Workaround)

Issue Description:
After saving, all timestamps (st_mtime, st_ctime, st_atime) are set to the same value.
After exporting or after some time, only modified_time resets to a past timestamp.

Cache files are created during export and rely on modified_time.

Workaround:
Use created_time if modified_time is in the past.


#101007 (comment)
I initially suspected thirdparty/minizip/unzip.c because the timestamps were only reset after unz* functions. However, this behavior also occurs when no export is performed, once even when the Godot Editor was not running (terminated).

Test
screen-recording-20250220-161402_t6S8GUBK.mp4
timestamp check after export

After saving the time was still 16:xx and after export it was reset to 15:xx.

timestamp_bug

@Alex2782
Copy link
Member Author

@syntaxerror247 Does this workaround also work on your device?


Notice:

My first pull request wasn't accepted, there were these check warnings for Android. All other operating systems were not affected.

Error: drivers/unix/file_access_unix.cpp:348:21: error: 
comparison of integers of different signs: 'uint64_t' (aka 'unsigned long') and 
'__kernel_old_time_t' (aka 'long') [-Werror,-Wsign-compare]
                if (modified_time < status.st_ctime) {
                    ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~
1 error generated.
scons: *** [drivers/unix/file_access_unix.android.editor.arm64.o] Error 1

Copy link
Member

@syntaxerror247 syntaxerror247 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works as expected.

@AThousandShips AThousandShips added this to the 4.4 milestone Feb 20, 2025
@akien-mga akien-mga merged commit 5c0b0e9 into godotengine:master Feb 20, 2025
20 checks passed
@akien-mga
Copy link
Member

Thanks!

// Workaround for GH-101007
//FIXME: After saving, all timestamps (st_mtime, st_ctime, st_atime) are set to the same value.
// After exporting or after some time, only 'modified_time' resets to a past timestamp.
uint64_t created_time = status.st_ctime;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

st_ctime is not created_time.

The effects need to be examined in more detail, a few days ago I noticed that this timestamp was updated outside of Godot.

alex@localhost godot-github % adb shell "stat sdcard/Documents/starter-kit-city-builder"
  File: sdcard/Documents/starter-kit-city-builder
  Size: 3488	 Blocks: 7	 IO Blocks: 512	 directory
Device: 62h/98d	 Inode: 547529	 Links: 11	 Device type: 0,0
Access: (0770/drwxrwx---)	Uid: (    0/    root)	Gid: ( 9997/everybody)
Access: 2024-07-21 13:06:31.602339129 +0200
Modify: 2024-07-21 13:06:48.914339123 +0200
Change: 2024-07-21 13:06:48.914339123 +0200

Copy link
Member

@syntaxerror247 syntaxerror247 Feb 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

st_ctime updated when files metadata updates. So, if its metadata is updated due to any reason st_ctime would update. I thinks, it's not a problem for us as this would just create a new file_cache at export.

It is working in our usecase because when file is modified its size changes which probably triggers a st_ctime update.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Android export from android will not update main scene layout unless .godot/exported/... is deleted
5 participants