-
Notifications
You must be signed in to change notification settings - Fork 33
Torrent creation: add support for mtime-based file sorting #550
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
base: master
Are you sure you want to change the base?
Conversation
casey
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems reasonable to me! This needs a test.
| file_infos.push(FileInfo { | ||
| path: file_path, | ||
| length: Bytes(len), | ||
| mtime: metadata.modified().ok(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should return an error if we can't read the modificiation time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should that happen here (e.g. the FS has no mtime support at all) or later if we try to actually sort based on mtime?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, interesting, so Err here indicates that the system doesn't support mtime? I assumed it was an I/O error. Then yes, in that case we should throw the error later, if we actually try to sort on modification time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
An I/O error would result in an error in the former metadata() call. As of the modified() call, it seems that in practice it can only fail if stat returns a timespec with a strange tv_nsec value on UNIX platforms (https://github.com/rust-lang/rust/blob/master/library/std/src/sys/pal/unix/time.rs#L95), which should never happen unless the kernel has a bug.
Do you believe a.mtime.unwrap().cmp(&b.mtime.unwrap()) would be a sensible thing to do in that case? Storing io::Result in FileInfo would not work because errors don't implement PartialEq, Serialize/Deserialize and so on.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think storing it as an Option<SystemTime> is reasonable. On comparison I would do:
a.mtime.context(error::ModificationTimeMissing)?
.cmp(b.mtime.context(error::ModificationTimeMissing)?)
with a new error variant, ModificationTimeMissing. So the error is only returned if the modification time is missing and the user tries to sort on it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The standard slices' sort_by requires the comparator to return Ordering, so it seems that panicking is the only way to express an error there.
This can be useful for file collections that are periodically updated, so that the new files are appended to the end of the torrent, and the piece boundaries for the old ones are intact.