Hi,

So I've just spent a while tracking down why KSKs and SSKs don't collide, even 
if you insert different data. The answer is that in 
MultiPutCompletionCallback, onFailure gets called, but doesn't complete the 
request because it's still waiting on some blocks. onSuccess then gets called 
and so it returns success and tells the client that everything went fine. 
This could be fixed by changing the:

complete(null);

(line 40), to:

complete(this.e);

Which would consider any exception which it may have been given earlier. I'm 
happy to change this, but I'm not really sure whether this is a mistake or by 
design, since there is a certain degree of sense in reporting success when 
the onSuccess method is called, even if a failure occurred in the past. Note 
that, as far as I can tell, this only applies to collisions and cancellations 
- other errors (RNFs and the like - I assume all the nonfatal ones) are 
handled differently.

The second problem, however, is that nodes always report a collision, even if 
the data is the same. After some probing, it turns out this is because the 
last 64 bytes of the SSK headers are different between the block from the 
data store and the block being inserted (see 'equals' in SSKBlock.java). I 
gather from the comments in SSKBlock.java that these are signatures on the 
rest of the hash, so I'm confused as to how they can be different when the 
other 72 bytes are identical. This part I could use some advice on. Are they 
meant to be the same, or is there some reason why they'll differ?

Sorry for the slightly lengthy email!


Dave (dbkr)

Reply via email to