On 23/08/10 17:04, Richard W.M. Jones wrote:
On Mon, Aug 23, 2010 at 04:58:38PM +0100, Matthew Booth wrote:
> On 23/08/10 16:23, Richard W.M. Jones wrote:
>> BTW you need two spaces after full stops.
>
> Out of curiosity is that a technical or a stylistic requirement?
> Stylistically, double spaces after a full stop have always seemed
> anachronistic to me.
It's a stylistic one.
Meh. Done anyway.
>>>> +hpread returns a NULL C<content> on
error.");
>>>> +
>>>> + ("hwrite", (RErr, [Int "handle"; BufferIn
"content"]), 273,
>>>> + [ProtocolLimitWarning], [],
>>>> + "write data to an open handle",
>>>> + "\
>>>> +This command writes all the data in C<content> to
C<handle>. It
>>>> +returns an error if this fails.");
>> So we're definitely disallowing partial writes, even though in some
>> future version we might allow writes to non-file handles? This API
>> won't allow partial writes.
>
> Yes. I think reads and writes are quite different in this respect.
> You always know exactly what you want to write, but you may not know
> what can be read. If this assumption is wrong, now's the time to
> disagree.
I think we should change pwrite in that case. pwrite only works on
files, and AFAICT there is never a situation where a partial write is
possible for a file, so we should turn pwrite into a full write and
change the documentation accordingly.
Sure.
> Are you saying that a String can be magically turned into an
> enumerated type somehow? I was trying to work out how to use an
> enumerated type.
Sadly not. However we have a long history of using strings instead of
enumerated types throughout the API. In any case, either 0/1/2 needs
to be documented, or this should be a string. It should not be an
undocumented int.
Ok.
>>>> +On success, hseek returns the new offset from the
beginning of
>>>> +the file. It returns an offset of -1 on failure.");
>>>> +
>>>> + ("htruncate", (RErr, [Int "handle"; Int64
"size"]), 276, [],
>>>> + [],
>>>> + "truncate a file",
>>>> + "\
>>>> +This command sets the size of the file referred to by C<handle>
>>>> +to C<size>. If the file was previously larger than
C<size>, the
>>>> +extra data will be lost. If the file was previously smaller than
>>>> +C<size>, the file will be zero-filled. The latter case will
>>>> +typically create a sparse file.");
>> Since we already have truncate and allocate calls, I wonder what the
>> benefit is of having handle versions. I mean, these are extremely
>> infrequent operations compared to hread/hwrite, so I doubt there's any
>> optimization benefit in adding these, and if we add these, why not
>> other very infrequent ops.
>
> htruncate is required when streaming a file with sparse sections. i.e.
>
> h = hopen_file("/foo");
> hwrite(h, "foo");
> htruncate(h, hseek(h, 1024, CUR));
>
> Technically you only need this for a sparse section at the end of a
> file. You could do it by mixing paths and file handles, but that
> would be a bit jarring.
I don't think I understand this. If you're writing to a file, you can
truncate it once (before any writing) to set its size:
truncate-size "/output" 100M;
hopen-file "/output";
hwrite ...;
hwrite ...;
hwrite ...;
hclose fd;
Why is htruncate needed during writes?
You assume above that you know in advance how large the file you're
writing will be. As I said, you could move that truncate-size to the
end, but mixing paths and handles is nasty and occasionally error-prone.
Consider:
h = hopen_file("/foo");
hwrite ...;
hwrite ...;
mv("/foo", "/bar");
hwrite ...;
hwrite ...;
truncate("/foo", x);
You've now created 2 files rather than 1. If you use htruncate rather
than truncate here it's robust to any changes in paths.
> hallocate is similarly there to avoid a jarring mix of paths and
> file handles when operating on a single file. I could also add
> fchmod and fchown, I guess. Any more?
My point was we don't need to duplicate all of these.
hallocate has the same argument as above: it's a non-path based
alternative. The argument for it is the same as the argument for all the
posix f* calls which take file descriptors instead of path names. There
may be a performance benefit to it, but principally it's harder to make
a class of stupid mistake.
Matt
--
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team
GPG ID: D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490