Add TOASTY_WRITE_TRUNCATE_AFTER flag for HTTP PUT semantics
Adds support for truncating files after write operations, enabling proper HTTP PUT semantics where the entire file content should be replaced. Implementation: - Added TOASTY_WRITE_TRUNCATE_AFTER flag (0x02) to ToastyFS API - Updated file_tree_write() to accept truncate_after parameter: * When true, sets file size to exactly offset+length * Removes chunks beyond the new file size * Marks removed chunks for garbage collection - Metadata server extracts and passes truncate flag to file_tree_write() - WAL replay passes false for truncate_after (already handled in original write) - Web proxy PUT now uses both CREATE_IF_MISSING and TRUNCATE_AFTER flags - Updated documentation in PROTOCOL.txt, DESIGN.txt, and web/DESIGN.txt Benefits: - Proper HTTP PUT semantics (replace entire file content) - Efficient: single write operation truncates and updates file - Works with both sync and async APIs - Garbage collection automatically removes orphaned chunks
This commit is contained in:
@@ -634,13 +634,17 @@ process_client_write(MetadataServer *state, int conn_idx, ByteView msg)
|
||||
assert(0); // TODO
|
||||
}
|
||||
|
||||
// Extract flag values
|
||||
#define TOASTY_WRITE_CREATE_IF_MISSING (1 << 0)
|
||||
#define TOASTY_WRITE_TRUNCATE_AFTER (1 << 1)
|
||||
bool truncate_after = (flags & TOASTY_WRITE_TRUNCATE_AFTER) != 0;
|
||||
|
||||
uint64_t new_gen;
|
||||
int ret = file_tree_write(&state->file_tree, path, offset, length,
|
||||
num_chunks, expect_gen, &new_gen, new_hashes, removed_hashes, &num_removed);
|
||||
num_chunks, expect_gen, &new_gen, new_hashes, removed_hashes, &num_removed, truncate_after);
|
||||
|
||||
// If write failed because file doesn't exist and CREATE_IF_MISSING flag is set,
|
||||
// create the file and retry the write
|
||||
#define TOASTY_WRITE_CREATE_IF_MISSING (1 << 0)
|
||||
if (ret == FILETREE_NOENT && (flags & TOASTY_WRITE_CREATE_IF_MISSING)) {
|
||||
// Create the file with default chunk size of 4096 bytes
|
||||
uint64_t chunk_size = 4096;
|
||||
@@ -656,7 +660,7 @@ process_client_write(MetadataServer *state, int conn_idx, ByteView msg)
|
||||
if (create_ret == 0) {
|
||||
// File created successfully, retry the write with the new generation
|
||||
ret = file_tree_write(&state->file_tree, path, offset, length,
|
||||
num_chunks, create_gen, &new_gen, new_hashes, removed_hashes, &num_removed);
|
||||
num_chunks, create_gen, &new_gen, new_hashes, removed_hashes, &num_removed, truncate_after);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user