/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.yardstick.cache; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import javax.cache.event.CacheEntryEvent; import javax.cache.event.CacheEntryListenerException; import javax.cache.event.CacheEntryUpdatedListener; import org.apache.ignite.cache.query.ContinuousQuery; import org.apache.ignite.cache.query.QueryCursor; import org.yardstickframework.BenchmarkConfiguration; import org.yardstickframework.BenchmarkDriver; import org.yardstickframework.BenchmarkProbe; import org.yardstickframework.BenchmarkProbePoint; import static java.util.concurrent.TimeUnit.MINUTES; import static org.yardstickframework.BenchmarkUtils.errorHelp; import static org.yardstickframework.BenchmarkUtils.println; /** * Probe which calculate continuous query events. */ public class CacheEntryEventProbe implements BenchmarkProbe { /** */ private BenchmarkConfiguration cfg; /** Collected points. */ private Collection<BenchmarkProbePoint> collected = new ArrayList<>(); /** Query cursor. */ private QueryCursor qryCur; /** Service building probe points. */ private ExecutorService buildingService; /** {@inheritDoc} */ @Override public void start(BenchmarkDriver drv, BenchmarkConfiguration cfg) throws Exception { this.cfg = cfg; if (drv instanceof IgniteCacheAbstractBenchmark) { IgniteCacheAbstractBenchmark drv0 = (IgniteCacheAbstractBenchmark)drv; if (drv0.cache() != null) { ContinuousQuery<Integer, Integer> qry = new ContinuousQuery<>(); final AtomicLong cnt = new AtomicLong(); qry.setLocalListener(localListener(cnt)); qryCur = drv0.cache().query(qry); buildingService = Executors.newSingleThreadExecutor(); buildingService.execute(new Runnable() { @Override public void run() { try { while (!Thread.currentThread().isInterrupted()) { Thread.sleep(1000); long evts = cnt.getAndSet(0); BenchmarkProbePoint pnt = new BenchmarkProbePoint( TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()), new double[] {evts}); collectPoint(pnt); } } catch (InterruptedException e) { // No-op. } } }); println(cfg, getClass().getSimpleName() + " probe is started."); } } if (qryCur == null) errorHelp(cfg, "Can not start " + getClass().getSimpleName() + " probe. Probably, the driver doesn't provide \"cache()\" method."); } /** * @param cntr Received event counter. * @return Local listener. */ protected CacheEntryUpdatedListener<Integer, Integer> localListener(final AtomicLong cntr) { return new CacheEntryUpdatedListener<Integer, Integer>() { @Override public void onUpdated(Iterable<CacheEntryEvent<? extends Integer, ? extends Integer>> events) throws CacheEntryListenerException { int size = 0; for (CacheEntryEvent<? extends Integer, ? extends Integer> e : events) ++size; cntr.addAndGet(size); } }; } /** {@inheritDoc} */ @Override public void stop() throws Exception { if (qryCur != null) { qryCur.close(); qryCur = null; buildingService.shutdownNow(); buildingService.awaitTermination(1, MINUTES); println(cfg, getClass().getSimpleName() + " is stopped."); } } /** {@inheritDoc} */ @Override public Collection<String> metaInfo() { return Arrays.asList("Time, sec", "Received events/sec (more is better)"); } /** {@inheritDoc} */ @Override public synchronized Collection<BenchmarkProbePoint> points() { Collection<BenchmarkProbePoint> ret = collected; collected = new ArrayList<>(ret.size() + 5); return ret; } /** {@inheritDoc} */ @Override public void buildPoint(long time) { // No-op. } /** * @param pnt Probe point. */ private synchronized void collectPoint(BenchmarkProbePoint pnt) { collected.add(pnt); } }