/** * Licensed to The Apereo Foundation under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * * The Apereo Foundation licenses this file to you under the Educational * Community 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://opensource.org/licenses/ecl2.txt * * 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.opencastproject.assetmanager.impl; import static java.lang.String.format; import org.opencastproject.assetmanager.api.Snapshot; import org.opencastproject.security.api.DefaultOrganization; import com.entwinemedia.fn.P1; import com.entwinemedia.fn.P1Lazy; import com.entwinemedia.fn.P2; import com.entwinemedia.fn.Products; import com.entwinemedia.fn.Unit; import com.entwinemedia.fn.data.ImmutableIteratorArrayAdapter; import com.entwinemedia.fn.data.Opt; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Iterator; import java.util.UUID; /** * Performance tests. */ @Ignore public class AbstractAssetManagerPerformanceTest extends AbstractAssetManagerTestBase { private static final Logger logger = LoggerFactory.getLogger(AbstractAssetManagerPerformanceTest.class); private static final int MEDIAPACKAGES_COUNT = 800; private static final String[] RANDOM_STRINGS = new String[200000]; static { for (int i = 0; i < RANDOM_STRINGS.length; i++) { RANDOM_STRINGS[i] = UUID.randomUUID().toString(); } } @Test public void testInsertSelectDelete() { // add final Snapshot[] snapshots = benchmark("take snapshot", new P1Lazy<P2<Snapshot[], Integer>>() { @Override public P2<Snapshot[], Integer> get1() { final Snapshot[] snapshots = createAndAddMediaPackages(MEDIAPACKAGES_COUNT, 1, 1, Opt.some("series")); final Iterator<String> randomStrings = new ImmutableIteratorArrayAdapter<>(RANDOM_STRINGS); for (Snapshot snapshot : snapshots) { am.setProperty(p.agent.mk(snapshot.getMediaPackage().getIdentifier().toString(), randomStrings.next())); } for (Snapshot snapshot : snapshots) { am.setProperty(p2.legacyId.mk(snapshot.getMediaPackage().getIdentifier().toString(), randomStrings.next())); } return Products.E.p2(snapshots, snapshots.length); } }); // select benchmark("select", new P1Lazy<P2<Unit, Integer>>() { @Override public P2<Unit, Integer> get1() { for (Snapshot snapshot : snapshots) { q.select(q.snapshot()) .where(q.mediaPackageId(snapshot.getMediaPackage().getIdentifier().toString()) .and(q.version().isLatest()) .and(p.agent.eq(randomElem(RANDOM_STRINGS))) .and(p2.hasPropertiesOfNamespace())) .run(); } return Products.E.p2(Unit.unit, snapshots.length); } }); // delete properties benchmark("delete properties", new P1Lazy<P2<Unit, Integer>>() { @Override public P2<Unit, Integer> get1() { final Iterator<String> randomStrings = new ImmutableIteratorArrayAdapter<>(RANDOM_STRINGS); for (Snapshot snapshot : snapshots) { final String mpId = snapshot.getMediaPackage().getIdentifier().toString(); q.delete(OWNER, p.allProperties()) .where(q.mediaPackageId(mpId).and(q.organizationId(DefaultOrganization.DEFAULT_ORGANIZATION_ID))) .run(); // q.delete(p.allProperties()) // .where(q.mediaPackageId(snapshot.getMediaPackage().getIdentifier().toString()) // .and(q.version().isLatest()) // .and(p.agent.eq(randomStrings.next())) // .and(p2.hasPropertiesOfNamespace())) // .run(); } return Products.E.p2(Unit.unit, snapshots.length); } }); // q.delete(q.propertiesOf(namespace)).where(q.organizationId(orgId).and(q.mediaPackageId(mpId))).run(); if (true) return; benchmark("delete snapshots", new P1Lazy<P2<Unit, Integer>>() { @Override public P2<Unit, Integer> get1() { final Iterator<String> randomStrings = new ImmutableIteratorArrayAdapter<>(RANDOM_STRINGS); for (Snapshot snapshot : snapshots) { q.delete(OWNER, q.snapshot()) .where(q.mediaPackageId(snapshot.getMediaPackage().getIdentifier().toString()) .and(q.version().isLatest()) .and(p.agent.eq(randomStrings.next())) .and(p2.hasPropertiesOfNamespace())) .run(); } return Products.E.p2(Unit.unit, snapshots.length); } }); } private <A> A randomElem(A[] as) { return as[((int) Math.max(0, Math.random() * as.length - 1))]; } /** Let <code>p</code> return a value and the number of performed operations. */ private <A> A benchmark(String name, P1<P2<A, Integer>> p) { final long start = System.nanoTime(); final P2<A, Integer> a = p.get1(); printStats(name, start, a.get2()); return a.get1(); } private void printStats(String name, long start, int ops) { long end = System.nanoTime(); double elapsedSeconds = (end - start) / 1000000000.0d; double opsPerSecond = ops / elapsedSeconds; logger.info(format("Benchmark %s: ops=%d runtime=%.1fs ops/s=%.2f", name, ops, elapsedSeconds, opsPerSecond)); } }