On Thu, Apr 21, 2016 at 02:25:28PM -0400, Jan Harkes wrote:
> On Thu, Apr 21, 2016 at 02:16:02PM +0200, [email protected] wrote:
> > The only problem we hit there was not with clog but with memory alignment
> > in cfs (which we then fixed).
>
> Looking forward to seeing patches related to that.
Attaching.
> > There is no http involved (it would be a large overhead without any reason).
> >
> > This data does not have to be secured against MitM, the worst which can
> > happen is disruption of communication / DOS which MitM always can achieve.
>
> Depends on what the configuration contains.
Correct. That's why we can not come to a conclusion without looking at
the actual code / specification. We can return to the subject when we
look at the corresponding patch later.
> > With ViceGetVolumeLocation() we make a similar mistake (!), we do
> > not allow for the returned string to be invalidated "properly". There
> > should have been some kind of a validity promise (say a TTL) included.
> > A possibility to change host names in a realm setup without confusing
> > the clients is a Good Thing (TM), why forbid this by design?
>
> GetVolumeLocation returns a DNS hostname, DNS records have a TTL. There
> is nothing here forbidden by design, we just don't duplicate something
> that is already there.
In your scheme there are several mappings to do:
volume/server -[1]-> dnsname -[2]-> ip
It was not about [2] but about [1] which "risks to fail to become invalidated"
when it is stale.
I understand now that you implied to reresolve volume/server->dnsname
when the client loses contact with a server.
We in our code trigger reresolution when a server becomes unreachable
(for "too long").
Then indeed no special expiration time is needed.
> It just seems like we're having the same discussions over and over
You are right, we have already presented the arguments a couple
of years ago and also commented on them, no need to duplicate.
> again, and yet it always results in to us disagreeing and you just
No, not _that_ bad. We actually agree on most things, we just put the
discussion effort into the ones where we do not :) the other ones go
unnoticed.
Think also, if I wouldn't value your comments, I wouldn't ask for them.
> doing your thing anyway,
That's how the things get done. One implements what one feels is the
most suitable approach.
> Jan
Best regards,
Rune
coda-src/vtools/cfs.cc | 27 +++++++++++++++++++--------
1 files changed, 19 insertions(+), 8 deletions(-)
--- a/coda-src/vtools/cfs.cc
+++ b/coda-src/vtools/cfs.cc
@@ -1826,8 +1826,8 @@ static void ListVolume(int argc, char *argv[], int opslot)
VolumeStatus *vs;
char *volname, *omsg, *motd;
VolumeStateType conn_state;
- int conflict, cml_count;
- unsigned int age, time;
+ int32_t conflict, cml_count;
+ uint32_t age, time;
uint64_t cml_bytes;
char *ptr;
int local_only = 0;
@@ -1859,25 +1859,36 @@ static void ListVolume(int argc, char *argv[], int
opslot)
cml_count, offlinemsg, motd, age, time, cml_bytes) */
ptr = piobuf; /* invariant: ptr always point to next obj
to be read */
+/* we hope that piobuf is sufficiently well aligned */
vs = (VolumeStatus *)ptr;
ptr += sizeof(VolumeStatus);
volname = ptr; ptr += strlen(volname)+1;
- conn_state = (VolumeStateType)*(int32_t *)ptr;
+/* avoid unaligned memory accesses */
+ { int32_t temp;
+ memcpy(&temp, ptr, sizeof(int32_t));
+ conn_state = (VolumeStateType)temp;
+ }
+/* conn_state = (VolumeStateType)*(int32_t *)ptr; */
ptr += sizeof(int32_t);
- conflict = *(int32_t *)ptr;
+ memcpy(&conflict, ptr, sizeof(int32_t));
+/* conflict = *(int32_t *)ptr; */
ptr += sizeof(int32_t);
- cml_count = *(int32_t *)ptr;
+ memcpy(&cml_count, ptr, sizeof(int32_t));
+/* cml_count = *(int32_t *)ptr; */
ptr += sizeof(int32_t);
omsg = ptr; ptr += strlen(omsg)+1;
motd = ptr; ptr += strlen(motd)+1;
- age = *(uint32_t *)ptr;
+ memcpy(&age, ptr, sizeof(uint32_t));
+/* age = *(uint32_t *)ptr; */
ptr += sizeof(uint32_t);
- time = *(uint32_t *)ptr;
+ memcpy(&time, ptr, sizeof(uint32_t));
+/* time = *(uint32_t *)ptr; */
ptr += sizeof(uint32_t);
- cml_bytes = *(uint64_t *)ptr;
+ memcpy(&cml_bytes, ptr, sizeof(uint64_t));
+/* cml_bytes = *(uint64_t *)ptr; */
ptr += sizeof(uint64_t);
/* Print output fields */