GET
disk_file = self.get_diskfile(...)
with disk_file.open():
metadata = disk_file.get_metadata()
response = Response(app_iter=disk_file.reader, ...)
POST
disk_file = self.get_diskfile(...)
orig_metadata = disk_file.read_metadata()
disk_file.write_metadata(metadata)
PUT
disk_file = self.get_diskfile(...)
orig_metadata = disk_file.read_metadata()
with disk_file.create(size=fsize) as writer:
writer.write(chunk)
writer.put(metadata)
writer.commit(request.timestamp)
HEAD
disk_file = self.get_diskfile(...)
orig_metadata = disk_file.read_metadata()
DELETE
disk_file = self.get_diskfile(...)
orig_metadata = disk_file.read_metadata()
disk_file.delete(req_timestamp)
As one can note from above flow, the processing of only GET
request actually needs to open the file. All other requests only ask for metadata by calling disk_file.read_metadata()
. The problem here is, internally disk_file.read_metadata()
calls disk_file.open()
which results in the file being opened (optionally read if etag is stale) and closed. DiskFile implementations are free to implement disk_file.read_metadata()
in any way it chooses to.