use of io.cdap.cdap.spi.metadata.MutationOptions in project cdap by caskdata.
the class ElasticsearchMetadataStorageTest method testScrollTimeout.
@Test
public void testScrollTimeout() throws IOException, InterruptedException {
MetadataStorage mds = getMetadataStorage();
MutationOptions options = MutationOptions.builder().setAsynchronous(false).build();
List<MetadataRecord> records = IntStream.range(0, 20).boxed().map(i -> new MetadataRecord(MetadataEntity.ofDataset("ns" + i, "ds" + i), new Metadata(MetadataScope.USER, tags("tag", "t" + i), props("p", "v" + i)))).collect(Collectors.toList());
mds.batch(records.stream().map(r -> new Update(r.getEntity(), r.getMetadata())).collect(Collectors.toList()), options);
SearchRequest request = SearchRequest.of("t*").setCursorRequested(true).setLimit(5).build();
SearchResponse response = mds.search(request);
Assert.assertEquals(5, response.getResults().size());
Assert.assertNotNull(response.getCursor());
SearchRequest request2 = SearchRequest.of("t*").setCursor(response.getCursor()).build();
SearchResponse response2 = mds.search(request2);
Assert.assertEquals(5, response2.getResults().size());
// it works despite a cursor and an offset (which is equal to the cursor's)
SearchRequest request2a = SearchRequest.of("t*").setCursor(response.getCursor()).setOffset(5).build();
SearchResponse response2a = mds.search(request2a);
Assert.assertEquals(5, response2a.getOffset());
Assert.assertEquals(5, response2a.getLimit());
Assert.assertEquals(response2.getResults(), response2a.getResults());
// it works despite a cursor and an offset (which is different from the cursor's)
SearchRequest request2b = SearchRequest.of("t*").setCursor(response.getCursor()).setOffset(8).build();
SearchResponse response2b = mds.search(request2b);
Assert.assertEquals(5, response2b.getOffset());
Assert.assertEquals(5, response2b.getLimit());
Assert.assertEquals(response2.getResults(), response2b.getResults());
// sleep 1 sec longer than the configured scroll timeout to invalidate cursor
TimeUnit.SECONDS.sleep(3);
SearchResponse response3 = mds.search(request2);
Assert.assertEquals(response2.getResults(), response3.getResults());
Assert.assertEquals(response2.getCursor(), response3.getCursor());
// it works despite an expired cursor and an offset (which is different from the cursor's)
SearchRequest request3a = SearchRequest.of("t*").setCursor(response.getCursor()).setOffset(8).build();
SearchResponse response3a = mds.search(request3a);
Assert.assertEquals(5, response3a.getOffset());
Assert.assertEquals(5, response3a.getLimit());
Assert.assertEquals(response2.getResults(), response3a.getResults());
// create a nonsense cursor and search with that
Cursor cursor = Cursor.fromString(response.getCursor());
cursor = new Cursor(cursor, cursor.getOffset(), "nosuchcursor");
SearchRequest request4 = SearchRequest.of("t*").setCursor(cursor.toString()).build();
SearchResponse response4 = mds.search(request4);
// compare only the results, not the entire response (the cursor is different)
Assert.assertEquals(response2.getResults(), response4.getResults());
// clean up
mds.batch(records.stream().map(MetadataRecord::getEntity).map(Drop::new).collect(Collectors.toList()), options);
}
Aggregations