Package edu.brown.hstore

Source Code of edu.brown.hstore.TestHStoreThreadManager

package edu.brown.hstore;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import org.voltdb.EELibraryLoader;
import org.voltdb.catalog.Partition;
import org.voltdb.catalog.Site;

import edu.brown.BaseTestCase;
import edu.brown.hstore.conf.HStoreConf;
import edu.brown.utils.CollectionUtil;
import edu.brown.utils.ProjectType;
import edu.brown.utils.StringUtil;
import edu.brown.utils.ThreadUtil;

public class TestHStoreThreadManager extends BaseTestCase {

    private static final int NUM_PARTITIONS = 2;
    private static final int NUM_CORES = 8;

    private HStoreConf hstore_conf;
    private Site catalog_site;
   
    @Override
    protected void setUp() throws Exception {
        super.setUp(ProjectType.TM1);
        this.addPartitions(NUM_PARTITIONS);
       
        ThreadUtil.setMaxGlobalThreads(NUM_CORES);
        EELibraryLoader.loadExecutionEngineLibrary(true);
       
        this.hstore_conf = HStoreConf.singleton();
        this.hstore_conf.site.cpu_affinity = true;
        this.hstore_conf.site.cpu_partition_blacklist = null;

        this.catalog_site = CollectionUtil.first(catalogContext.sites);
    }
   
    /**
     * testRegisterEEThreadBlacklist
     */
    public void testRegisterEEThreadBlacklist() throws Exception {
        Thread self = Thread.currentThread();
       
        Set<Integer> whitelist = new HashSet<Integer>();
        for (int cpu = 0; cpu < NUM_CORES; cpu++) {
            if (cpu % 3 == 0) {
                whitelist.add(cpu);
            }
            if (whitelist.size() == NUM_PARTITIONS) break;
        } // FOR
        Set<Integer> blacklist = new HashSet<Integer>();
        for (int cpu = 0; cpu < NUM_CORES; cpu++) {
            if (whitelist.contains(cpu) == false) {
                blacklist.add(cpu);
            }
        } // FOR
       
        this.hstore_conf.site.cpu_affinity = true;
        this.hstore_conf.site.cpu_affinity_one_partition_per_core = false;
        this.hstore_conf.site.cpu_partition_blacklist = StringUtil.join(" ,", blacklist);
       
        MockHStoreSite hstore_site = new MockHStoreSite(catalog_site.getId(), catalogContext, hstore_conf);
        HStoreThreadManager manager = hstore_site.getThreadManager();
        HStoreThreadManager.Debug managerDebug = manager.getDebugContext();

        // Check whether we can register the thread and it doesn't
        // come back as disabled
        Partition partition = CollectionUtil.first(this.catalog_site.getPartitions());
        boolean ret = manager.registerEEThread(partition);
        assertTrue(ret);
        assertTrue(manager.isEnabled());
        assertTrue(managerDebug.isRegistered(self));
       
        // It should be allowed to execute on every CPU except for the first two
        Collection<Integer> cpuIds = managerDebug.getCPUIds(self);
        assertEquals(NUM_PARTITIONS, cpuIds.size());
        for (int cpu = 0; cpu < NUM_CORES; cpu++) {
            if (blacklist.contains(cpu)) {
                assertFalse(Integer.toString(cpu), cpuIds.contains(cpu));
            } else {
                assertTrue(Integer.toString(cpu), cpuIds.contains(cpu));
                assertTrue(Integer.toString(cpu), whitelist.contains(cpu));
            }
        } // FOR
    }
   
    /**
     * testRegisterEEThreadOnePerPartition
     */
    public void testRegisterEEThreadOnePerPartition() throws Exception {
        Thread self = Thread.currentThread();
       
        this.hstore_conf.site.cpu_affinity = true;
        this.hstore_conf.site.cpu_affinity_one_partition_per_core = true;
       
        MockHStoreSite hstore_site = new MockHStoreSite(catalog_site.getId(), catalogContext, hstore_conf);
        HStoreThreadManager manager = hstore_site.getThreadManager();
        HStoreThreadManager.Debug managerDebug = manager.getDebugContext();

        // Check whether we can register the thread and it doesn't
        // come back as disabled
        Partition partition = CollectionUtil.first(this.catalog_site.getPartitions());
        boolean ret = manager.registerEEThread(partition);
        assertTrue(ret);
        assertTrue(manager.isEnabled());
        assertTrue(managerDebug.isRegistered(self));
       
        // It should be allowed to execute on every CPU except for the first two
        Collection<Integer> cpuIds = managerDebug.getCPUIds(self);
        assertEquals(1, cpuIds.size());
    }
   
    /**
     * testRegisterEEThread
     */
    public void testRegisterEEThread() throws Exception {
        Thread self = Thread.currentThread();
       
        this.hstore_conf.site.cpu_affinity = true;
        this.hstore_conf.site.cpu_affinity_one_partition_per_core = false;
       
        MockHStoreSite hstore_site = new MockHStoreSite(catalog_site.getId(), catalogContext, hstore_conf);
        HStoreThreadManager manager = hstore_site.getThreadManager();
        HStoreThreadManager.Debug managerDebug = manager.getDebugContext();

        // Check whether we can register the thread and it doesn't
        // come back as disabled
        Partition partition = CollectionUtil.first(this.catalog_site.getPartitions());
        boolean ret = manager.registerEEThread(partition);
        assertTrue(ret);
        assertTrue(manager.isEnabled());
        assertTrue(managerDebug.isRegistered(self));
       
        // It should be allowed to execute on every CPU except for the first two
        Collection<Integer> cpuIds = managerDebug.getCPUIds(self);
        assertEquals(NUM_PARTITIONS, cpuIds.size());
        for (int cpu = 0; cpu < NUM_PARTITIONS; cpu++) {
            assertTrue(Integer.toString(cpu), cpuIds.contains(cpu));
        } // FOR
    }
   
    /**
     * testRegisterProcessingThread
     */
    public void testRegisterProcessingThread() throws Exception {
        Thread self = Thread.currentThread();
       
        MockHStoreSite hstore_site = new MockHStoreSite(catalog_site.getId(), catalogContext, hstore_conf);
        HStoreThreadManager manager = hstore_site.getThreadManager();
        HStoreThreadManager.Debug managerDebug = manager.getDebugContext();

        // Check whether we can register the thread and it doesn't
        // come back as disabled
        boolean ret = manager.registerProcessingThread();
        assertTrue(ret);
        assertTrue(manager.isEnabled());
        assertTrue(managerDebug.isRegistered(self));
       
        // It should be allowed to execute on every CPU except for the first two
        Collection<Integer> cpuIds = managerDebug.getCPUIds(self);
        assertEquals(NUM_CORES - NUM_PARTITIONS, cpuIds.size());
        for (int cpu = 0; cpu < NUM_PARTITIONS; cpu++) {
            assertFalse(Integer.toString(cpu), cpuIds.contains(cpu));
        } // FOR
    }
   
}
TOP

Related Classes of edu.brown.hstore.TestHStoreThreadManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.