void setKey(int blockNumber, ClientCHK key) throws IOException { if(logMINOR) Logger.minor(this, "Setting key "+key+" for block "+blockNumber+" on "+this, new Exception("debug")); try { ClientCHK oldKey = readKey(blockNumber); if(!oldKey.equals(key)) throw new IOException("Key for block has changed! Data corruption or bugs in SplitFileInserter code"); } catch (MissingKeyException e) { // Ok. writeKey(blockNumber, key); } // Must be called either way as we don't regenerate blocksHaveKeys on startup. setHasKey(blockNumber); }
ClientCHK readKey(int blockNumber) throws IOException, MissingKeyException { byte[] buf = parent.innerReadSegmentKey(segNo, blockNumber); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeInt(segNo); dos.writeInt(blockNumber); dos.close(); byte[] prefix = baos.toByteArray(); byte[] checkBuf = new byte[prefix.length + buf.length]; System.arraycopy(prefix, 0, checkBuf, 0, prefix.length); int checksumLength = parent.checker.checksumLength(); System.arraycopy(buf, 0, checkBuf, prefix.length, buf.length - checksumLength); byte[] checksum = Arrays.copyOfRange(buf, buf.length - checksumLength, buf.length); if(parent.checker.checkChecksum(checkBuf, 0, checkBuf.length, checksum)) throw new MissingKeyException(); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(buf)); byte b = dis.readByte(); if(b != 1) throw new MissingKeyException(); ClientCHK key = innerReadKey(dis); setHasKey(blockNumber); if(logDEBUG) Logger.debug(this, "Returning "+key); return key; }