use of com.alibaba.graphscope.groot.SnapshotListener in project GraphScope by alibaba.
the class SnapshotCacheTest method testSnapshotCache.
@Test
void testSnapshotCache() {
SnapshotCache snapshotCache = new SnapshotCache();
GraphDef graphDef = null;
snapshotCache.advanceQuerySnapshotId(5L, graphDef);
assertEquals(snapshotCache.getSnapshotWithSchema().getSnapshotId(), 5L);
SnapshotListener listener1 = mock(SnapshotListener.class);
snapshotCache.addListener(5L, listener1);
verify(listener1, times(1)).onSnapshotAvailable();
SnapshotListener listener2 = mock(SnapshotListener.class);
snapshotCache.addListener(6L, listener2);
snapshotCache.advanceQuerySnapshotId(6L, graphDef);
verify(listener2, times(1)).onSnapshotAvailable();
snapshotCache.advanceQuerySnapshotId(7L, graphDef);
verify(listener1, times(1)).onSnapshotAvailable();
verify(listener2, times(1)).onSnapshotAvailable();
}
use of com.alibaba.graphscope.groot.SnapshotListener in project GraphScope by alibaba.
the class SchemaManagerTest method testSchemaManager.
@Test
void testSchemaManager() throws IOException, InterruptedException {
SnapshotManager mockSnapshotManager = mock(SnapshotManager.class);
doAnswer(invocationOnMock -> {
SnapshotListener listener = invocationOnMock.getArgument(1);
listener.onSnapshotAvailable();
return null;
}).when(mockSnapshotManager).addSnapshotListener(anyLong(), any());
when(mockSnapshotManager.increaseWriteSnapshotId()).thenReturn(1L);
when(mockSnapshotManager.getCurrentWriteSnapshotId()).thenReturn(1L);
DdlExecutors ddlExecutors = new DdlExecutors();
DdlWriter mockDdlWriter = mock(DdlWriter.class);
when(mockDdlWriter.writeOperations(anyString(), any())).thenReturn(new BatchId(1L));
MetaService mockMetaService = mock(MetaService.class);
GraphDefFetcher mockGraphDefFetcher = mock(GraphDefFetcher.class);
GraphDef initialGraphDef = GraphDef.newBuilder().build();
when(mockGraphDefFetcher.fetchGraphDef()).thenReturn(initialGraphDef);
SchemaManager schemaManager = new SchemaManager(mockSnapshotManager, ddlExecutors, mockDdlWriter, mockMetaService, mockGraphDefFetcher);
schemaManager.start();
assertEquals(initialGraphDef, schemaManager.getGraphDef());
PropertyValue defaultValue = new PropertyValue(DataType.INT, ByteBuffer.allocate(Integer.BYTES).putInt(1).array());
PropertyDef propertyDef = new PropertyDef(1, 1, "p1", DataType.INT, defaultValue, true, "property_1");
TypeDef typeDef = TypeDef.newBuilder().setLabel("vertex1").addPropertyDef(propertyDef).setTypeEnum(TypeEnum.VERTEX).build();
DdlRequestBatch ddlRequestBatch = DdlRequestBatch.newBuilder().addDdlRequest(new CreateVertexTypeRequest(typeDef)).build();
CountDownLatch latch = new CountDownLatch(1);
schemaManager.submitBatchDdl("requestId", "sessionId", ddlRequestBatch, new CompletionCallback<Long>() {
@Override
public void onCompleted(Long res) {
latch.countDown();
}
@Override
public void onError(Throwable t) {
}
});
assertTrue(latch.await(5L, TimeUnit.SECONDS));
schemaManager.stop();
}
use of com.alibaba.graphscope.groot.SnapshotListener in project GraphScope by alibaba.
the class SnapshotManager method maybeUpdateQuerySnapshotId.
private void maybeUpdateQuerySnapshotId() {
if (this.storeToSnapshotInfo.size() < this.storeCount) {
logger.warn("Not all store nodes reported snapshot progress. current storeToSnapshot [" + this.storeToSnapshotInfo + "]");
return;
}
SnapshotInfo minSnapshotInfo = Collections.min(this.storeToSnapshotInfo.values());
if (minSnapshotInfo.getSnapshotId() > this.querySnapshotInfo.getSnapshotId()) {
synchronized (this.querySnapshotLock) {
long snapshotId = minSnapshotInfo.getSnapshotId();
long ddlSnapshotId = minSnapshotInfo.getDdlSnapshotId();
long currentSnapshotId = this.querySnapshotInfo.getSnapshotId();
long currentDdlSnapshotId = this.querySnapshotInfo.getDdlSnapshotId();
if (snapshotId > currentSnapshotId) {
try {
if (ddlSnapshotId < currentDdlSnapshotId) {
// During failover, store might send smaller ddlSnapshotId
minSnapshotInfo = new SnapshotInfo(snapshotId, currentDdlSnapshotId);
// throw new
// IllegalStateException("minSnapshotInfo [" + minSnapshotInfo +
// "], currentSnapshotInfo [" +
// this.querySnapshotInfo + "]");
}
persistQuerySnapshotId(minSnapshotInfo);
this.querySnapshotInfo = minSnapshotInfo;
logger.debug("querySnapshotInfo updated to [" + minSnapshotInfo + "]");
} catch (IOException e) {
logger.error("update querySnapshotInfo failed", e);
return;
}
long newSnapshotId = minSnapshotInfo.getSnapshotId();
long newDdlSnapshotId = minSnapshotInfo.getDdlSnapshotId();
NavigableMap<Long, List<SnapshotListener>> listenersToTrigger = this.snapshotToListeners.headMap(newSnapshotId, true);
for (Map.Entry<Long, List<SnapshotListener>> listenerEntry : listenersToTrigger.entrySet()) {
List<SnapshotListener> listeners = listenerEntry.getValue();
for (SnapshotListener listener : listeners) {
try {
listener.onSnapshotAvailable();
} catch (Exception e) {
logger.warn("trigger snapshotListener failed. snapshotId [" + snapshotId + "]");
}
}
}
listenersToTrigger.clear();
for (QuerySnapshotListener listener : this.listeners) {
try {
listener.snapshotAdvanced(newSnapshotId, newDdlSnapshotId);
} catch (Exception e) {
logger.error("error occurred when notify normal listeners", e);
}
}
}
}
}
}
Aggregations