From: <mar...@us...> - 2011-06-13 13:07:36
|
Revision: 4698 http://bigdata.svn.sourceforge.net/bigdata/?rev=4698&view=rev Author: martyncutcher Date: 2011-06-13 13:07:25 +0000 (Mon, 13 Jun 2011) Log Message: ----------- Correct TestWriteCache to correctly process distinct IBufferAccess objects that duplicate data rather than mock up WriteCache objects with directly shared ByteBuffers. Also fix restoreRecordMap to ensure buffer limit is correctly set before processing Modified Paths: -------------- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/io/writecache/WriteCache.java branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/io/writecache/TestWriteCache.java Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/io/writecache/WriteCache.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/io/writecache/WriteCache.java 2011-06-10 23:20:14 UTC (rev 4697) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/java/com/bigdata/io/writecache/WriteCache.java 2011-06-13 13:07:25 UTC (rev 4698) @@ -1761,10 +1761,16 @@ */ public void resetRecordMapFromBuffer(final ByteBuffer buf, final Map<Long, RecordMetadata> recordMap) { recordMap.clear(); + final int sp = buf.position(); + int pos = 0; + buf.limit(sp); while (pos < buf.limit()) { buf.position(pos); long addr = buf.getLong(); + if (addr == 0L) { // end of content + break; + } int sze = buf.getInt(); if (sze == 0 /* deleted */) { recordMap.remove(addr); // should only happen if previous write already made to the buffer @@ -1775,7 +1781,7 @@ pos += 12 + sze; // hop over buffer info (addr + sze) and then // data } - } + } } @@ -2244,7 +2250,7 @@ writeLock.lockInterruptibly(); try { - resetRecordMapFromBuffer(buf.get().buffer(), recordMap); + resetRecordMapFromBuffer(buf.get().buffer().duplicate(), recordMap); } finally { writeLock.unlock(); } Modified: branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/io/writecache/TestWriteCache.java =================================================================== --- branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/io/writecache/TestWriteCache.java 2011-06-10 23:20:14 UTC (rev 4697) +++ branches/QUADS_QUERY_BRANCH/bigdata/src/test/com/bigdata/io/writecache/TestWriteCache.java 2011-06-13 13:07:25 UTC (rev 4698) @@ -928,31 +928,33 @@ int chk2 = ChecksumUtility.threadChk.get().checksum(data2, 0/* offset */, data2.limit()); WriteCache cache1 = new WriteCache.FileChannelScatteredWriteCache(buf, true, true, false, opener, null); - WriteCache cache2 = new WriteCache.FileChannelScatteredWriteCache(buf2, true, true, + WriteCache cache2 = new WriteCache.FileChannelScatteredWriteCache(buf, true, true, false, opener, null); // write first data buffer cache1.write(addr1, data1, chk1); data1.flip(); - buf2.buffer().limit(buf.buffer().position()); - buf2.buffer().position(0); + syncBuffers(buf, buf2); cache2.resetRecordMapFromBuffer(); + assertEquals(cache1.read(addr1), data1); assertEquals(cache2.read(addr1), data1); // now simulate removal/delete cache1.clearAddrMap(addr1); - buf2.buffer().limit(buf.buffer().position()); - buf2.buffer().position(0); + + syncBuffers(buf, buf2); + cache2.resetRecordMapFromBuffer(); + + assertTrue(cache1.read(addr1) == null); assertTrue(cache2.read(addr1) == null); - assertTrue(cache1.read(addr1) == null); // now write second data buffer cache1.write(addr1, data2, chk2); data2.flip(); - buf2.buffer().limit(buf.buffer().position()); - buf2.buffer().position(0); + // buf2.buffer().limit(buf.buffer().position()); + syncBuffers(buf, buf2); cache2.resetRecordMapFromBuffer(); assertEquals(cache2.read(addr1), data2); assertEquals(cache1.read(addr1), data2); @@ -964,6 +966,23 @@ opener.destroy(); } } + + // ensure dst buffer is copy of src + private void syncBuffers(final IBufferAccess src, final IBufferAccess dst) { + final ByteBuffer sb = src.buffer(); + final ByteBuffer db = dst.buffer(); + int sp = sb.position(); + int sl = sb.limit(); + sb.position(0); + db.position(0); + sb.limit(sp); + db.limit(sp); + db.put(sb); + sb.position(sp); + db.position(sp); + sb.limit(sl); + db.limit(sl); + } /* * Now generate randomviews, first an ordered view of 10000 random lengths This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |