@Override public void enforceSeek() throws IOException { if (realSeekDone) return; if (delayedReseek && this.isReseekable) { reseek(delayedSeekKV); } else { seek(delayedSeekKV); } }
@Override public Boolean call() throws Exception { Thread.currentThread().setName("reader " + readerId); Random rand = new Random(); StoreFileScanner scanner = reader.getStoreFileScanner(true, pread); while (System.currentTimeMillis() < endTime) { byte[] row = createRandomRow(rand, firstRow, lastRow); KeyValue kvToSeek = new KeyValue(row, family, createRandomQualifier(rand)); if (rand.nextDouble() < 0.0001) { LOG.info("kvToSeek=" + kvToSeek); } boolean seekResult; try { seekResult = scanner.seek(kvToSeek); } catch (IOException ex) { throw new IOException("Seek failed for key " + kvToSeek + ", pread=" + pread, ex); } numSeeks.incrementAndGet(); if (!seekResult) { error("Seek returned false for row " + Bytes.toStringBinary(row)); return false; } for (int i = 0; i < rand.nextInt(10) + 1; ++i) { KeyValue kv = scanner.next(); numKV.incrementAndGet(); if (i == 0 && kv == null) { error( "scanner.next() returned null at the first iteration for " + "row " + Bytes.toStringBinary(row)); return false; } if (kv == null) break; String keyHashStr = MD5Hash.getMD5AsHex(kv.getKey()); keysRead.add(keyHashStr); totalBytes.addAndGet(kv.getLength()); } } return true; }