Track actual bytes read in read operations

Add functionality to determine the actual number of bytes read during
read operations, making it possible to detect when a read was truncated
because it went past the end of the file.

Changes:
- Modified file_tree_read() to calculate and return actual_bytes via
  new output parameter
- Updated metadata server to send actual_bytes in READ_SUCCESS messages
- Added bytes_read field to ToastyResult structure
- Modified client to parse, store, and report actual bytes read
- Updated toasty_read() to return the actual number of bytes read
  instead of always returning 0
- Fixed web server to use bytes_read field instead of non-existent
  count field

This allows clients to distinguish between:
- Reading zeros because the file is sparse (has holes)
- Reading past the end of the file (truncated read)
This commit is contained in:
Claude
2025-11-22 22:22:43 +00:00
parent b930ba08e3
commit f856bd0e05
6 changed files with 44 additions and 10 deletions
+3 -3
View File
@@ -197,13 +197,13 @@ int main(void)
// First, ACK the byte we just read, even if it's
// just 0 bytes (every bodybuf must by paired with
// a bodyack).
proxied[i].transferred += result.count;
int ack = proxied[i].head_only ? 0 : result.count;
proxied[i].transferred += result.bytes_read;
int ack = proxied[i].head_only ? 0 : result.bytes_read;
http_response_builder_bodyack(proxied[i].builder, ack);
// If we didn't reach the end of the file, start
// a new read.
if (result.count > 0) {
if (result.bytes_read > 0) {
// Make sure there is some free space in the buffer
int mincap = 1<<10; // TODO: Choose based on overall file size