/* * Copyright 2008-2009 LinkedIn, Inc * * Licensed 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 voldemort; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import voldemort.store.Store; import voldemort.versioning.ObsoleteVersionException; import voldemort.versioning.Versioned; /** * Big honkin multithreaded stress test * * */ public class MultithreadedStressTest { private final ExecutorService service; private final Store<byte[], byte[], byte[]> store; private final AtomicInteger value; private final int numberOfValues; private final int numberOfRequests; public MultithreadedStressTest(Store<byte[], byte[], byte[]> store, int numberOfValues, int numberOfRequests, int numberOfThreads) { this.numberOfValues = numberOfValues; this.numberOfRequests = numberOfRequests; this.service = Executors.newFixedThreadPool(numberOfThreads); this.store = store; this.value = new AtomicInteger(0); for(int i = 0; i < numberOfValues; i++) this.store.put(Integer.toString(i).getBytes(), new Versioned<byte[]>(Integer.toString(i).getBytes()), null); } public void testGetAndPut() throws Exception { final AtomicInteger obsoletes = new AtomicInteger(0); final CountDownLatch isDone = new CountDownLatch(numberOfRequests); for(int i = 0; i < numberOfRequests; i++) { final int index = i % numberOfValues; service.execute(new Runnable() { public void run() { boolean done = false; while(!done) { try { byte[] key = Integer.toString(index).getBytes(); List<Versioned<byte[]>> found = store.get(key, null); if(found.size() > 1) { throw new RuntimeException("Found multiple versions: " + found); } else if(found.size() == 1) { Versioned<byte[]> versioned = found.get(0); byte[] valueBytes = Integer.toString(MultithreadedStressTest.this.value.getAndIncrement()) .getBytes(); versioned.setObject(valueBytes); store.put(key, versioned, null); done = true; } else if(found.size() == 0) { throw new RuntimeException("No values found!"); } } catch(ObsoleteVersionException e) { obsoletes.getAndIncrement(); } finally { isDone.countDown(); } } } }); } isDone.await(); System.err.println("Number of obsoletes: " + obsoletes.get()); System.exit(0); } }