Search in sources :

Example 16 with DefaultQueryService

use of org.apache.geode.cache.query.internal.DefaultQueryService in project geode by apache.

the class CqResultSetUsingPoolDUnitTest method testCqResultsCachingForDestroyEventsOnPR.

/**
   * Tests CQ Result Set caching for destroy events.
   * 
   * @throws Exception
   */
@Test
public void testCqResultsCachingForDestroyEventsOnPR() throws Exception {
    final Host host = Host.getHost(0);
    VM server1 = host.getVM(0);
    VM server2 = host.getVM(1);
    VM client = host.getVM(2);
    cqDUnitTest.createServerWithPR(server1, 0, false, 0);
    cqDUnitTest.createServerWithPR(server2, 0, false, 0);
    final int port = server1.invoke(() -> CqQueryUsingPoolDUnitTest.getCacheServerPort());
    final String host0 = NetworkUtils.getServerHostName(server1.getHost());
    String poolName = "testCqResults";
    final String cqName = "testCqResultsCachingForDestroyEventsOnPR_0";
    cqDUnitTest.createPool(client, poolName, host0, port);
    // Create client.
    cqDUnitTest.createClient(client, port, host0);
    // create CQ.
    cqDUnitTest.createCQ(client, poolName, cqName, cqDUnitTest.cqs[0]);
    // Execute CQ.
    cqDUnitTest.executeCQ(client, cqName, true, null);
    final int numObjects = 50;
    // initialize Region.
    server1.invoke(new CacheSerializableRunnable("Update Region") {

        public void run2() throws CacheException {
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            for (int i = 1; i <= numObjects; i++) {
                Portfolio p = new Portfolio(i);
                region.put("" + i, p);
            }
        }
    });
    // Update from server2.
    server2.invoke(new CacheSerializableRunnable("Update Region") {

        public void run2() throws CacheException {
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            for (int i = 1; i <= numObjects; i++) {
                Portfolio p = new Portfolio(i);
                region.put("" + i, p);
            }
        }
    });
    // Destroy entries.
    server2.invoke(new CacheSerializableRunnable("Update Region") {

        public void run2() throws CacheException {
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            for (int i = 1; i <= numObjects; i++) {
                Portfolio p = new Portfolio(i);
                region.destroy("" + i);
            }
        }
    });
    // Wait for events to be sent.
    cqDUnitTest.waitForDestroyed(client, cqName, "" + numObjects);
    // Verify CQ Cache results.
    server1.invoke(new CacheSerializableRunnable("Verify CQ Cache results") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                if (cqQuery.getCqResultKeysSize() > 0) {
                    fail("The CQ Result Cache on PR should have been empty for CQ :" + cqName + " keys=" + cqQuery.getCqResultKeyCache());
                }
            }
        }
    });
    server2.invoke(new CacheSerializableRunnable("Verify CQ Cache results") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                if (cqQuery.getCqResultKeysSize() > 0) {
                    fail("The CQ Result Cache on PR should have been empty for CQ :" + cqName);
                }
            }
        }
    });
    // Close.
    cqDUnitTest.closeClient(client);
    cqDUnitTest.closeServer(server1);
    cqDUnitTest.closeServer(server2);
}
Also used : CacheException(org.apache.geode.cache.CacheException) Portfolio(org.apache.geode.cache.query.data.Portfolio) Host(org.apache.geode.test.dunit.Host) CqService(org.apache.geode.cache.query.internal.cq.CqService) ServerCQImpl(org.apache.geode.cache.query.internal.cq.ServerCQImpl) CacheException(org.apache.geode.cache.CacheException) CacheSerializableRunnable(org.apache.geode.cache30.CacheSerializableRunnable) VM(org.apache.geode.test.dunit.VM) Region(org.apache.geode.cache.Region) Collection(java.util.Collection) InternalCqQuery(org.apache.geode.cache.query.internal.cq.InternalCqQuery) DefaultQueryService(org.apache.geode.cache.query.internal.DefaultQueryService) FlakyTest(org.apache.geode.test.junit.categories.FlakyTest) Test(org.junit.Test) DistributedTest(org.apache.geode.test.junit.categories.DistributedTest)

Example 17 with DefaultQueryService

use of org.apache.geode.cache.query.internal.DefaultQueryService in project geode by apache.

the class CqQueryUsingPoolDUnitTest method testFilterRegistrationDuringGII.

/**
   * Test Filter registration during GII. Bug fix 39014
   */
@Test
public void testFilterRegistrationDuringGII() throws Exception {
    final Host host = Host.getHost(0);
    VM server1 = host.getVM(0);
    VM server2 = host.getVM(1);
    VM client1 = host.getVM(2);
    VM client2 = host.getVM(3);
    Wait.pause(3 * 1000);
    createServer(server1);
    final int port1 = server1.invoke(() -> CqQueryUsingPoolDUnitTest.getCacheServerPort());
    final String host0 = NetworkUtils.getServerHostName(server1.getHost());
    final int[] ports = AvailablePortHelper.getRandomAvailableTCPPorts(1);
    String poolName = "testFilterRegistrationDuringGII";
    createPool(client1, poolName, new String[] { host0, host0 }, new int[] { port1, ports[0] }, "-1");
    createPool(client2, poolName, new String[] { host0, host0 }, new int[] { port1, ports[0] }, "-1");
    createClient(client1, new int[] { port1, ports[0] }, host0, "-1", poolName);
    createClient(client2, new int[] { port1, ports[0] }, host0, "-1", poolName);
    // Create CQs.
    final int numCQs = 2;
    for (int i = 0; i < numCQs; i++) {
        // Create CQs.
        createCQ(client1, poolName, "client1_" + i, cqs[i]);
        executeCQ(client1, "client1_" + i, false, null);
        createCQ(client2, poolName, "client2_" + i, cqs[i]);
        executeCQ(client2, "client2_" + i, false, null);
    }
    final int interestSize = 20;
    registerInterestListCQ(client1, regions[0], interestSize, false);
    registerInterestListCQ(client2, regions[0], 0, true);
    Wait.pause(1 * 1000);
    // CREATE.
    createValues(server1, regions[0], 100);
    createValues(server1, regions[1], 10);
    waitForCreated(client1, "client1_0", KEY + 10);
    // Create server2.
    server2.invoke(new CacheSerializableRunnable("Create Cache Server") {

        @Override
        public void run2() throws CacheException {
            LogWriterUtils.getLogWriter().info("### Create Cache Server. ###");
            AttributesFactory factory = new AttributesFactory();
            factory.setScope(Scope.DISTRIBUTED_ACK);
            factory.setMirrorType(MirrorType.KEYS_VALUES);
            for (int i = 0; i < regions.length; i++) {
                createRegion(regions[i], factory.createRegionAttributes());
            }
            InitialImageOperation.slowImageProcessing = 100;
            try {
                try {
                    startBridgeServer(ports[0], true);
                } catch (Exception ex) {
                    Assert.fail("While starting CacheServer", ex);
                }
                while (true) {
                    if (InitialImageOperation.slowImageSleeps > 0) {
                        // Create events while GII for HARegion is in progress.
                        LocalRegion region1 = (LocalRegion) getRootRegion().getSubregion(regions[0]);
                        for (int i = 90; i <= 120; i++) {
                            region1.put(KEY + i, new Portfolio(i, i));
                        }
                        break;
                    }
                    Wait.pause(20);
                }
            } finally {
                InitialImageOperation.slowImageProcessing = 0;
            }
        }
    });
    Wait.pause(3 * 1000);
    // Check if CQs are registered as part of GII.
    server2.invoke(new CacheSerializableRunnable("Create values") {

        @Override
        public void run2() throws CacheException {
            DefaultQueryService qs = (DefaultQueryService) getCache().getQueryService();
            Collection<CacheClientProxy> proxies = CacheClientNotifier.getInstance().getClientProxies();
            Iterator iter = proxies.iterator();
            try {
                for (CacheClientProxy p : proxies) {
                    ClientProxyMembershipID clientId = p.getProxyID();
                    List cqs = qs.getCqService().getAllClientCqs(clientId);
                    getCache().getLogger().fine("Number of CQs found for client :" + clientId + " are :" + cqs.size());
                    if (cqs.size() != numCQs) {
                        fail("Number of CQs registerted by the client is :" + cqs.size() + " less than expected : " + numCQs);
                    }
                    CqQuery cq = (CqQuery) cqs.get(0);
                    LocalRegion region1 = (LocalRegion) getRootRegion().getSubregion(regions[0]);
                    if (cq.getName().startsWith("client1_")) {
                        if (region1.getFilterProfile().getKeysOfInterest(clientId) == null || region1.getFilterProfile().getKeysOfInterest(clientId).size() != interestSize) {
                            fail("Interest registartion during Secondary HARegion creation has failed.");
                        }
                    } else {
                        if (!region1.getFilterProfile().isInterestedInAllKeys(clientId)) {
                            fail("Interest registartion during Secondary HARegion creation has failed.");
                        }
                    }
                }
            } catch (Exception ex) {
                fail("Exception while validating filter count. ", ex);
            }
        }
    });
    // Close.
    closeClient(client1);
    closeClient(client2);
    closeServer(server1);
    closeServer(server2);
}
Also used : CacheClientProxy(org.apache.geode.internal.cache.tier.sockets.CacheClientProxy) CacheException(org.apache.geode.cache.CacheException) Portfolio(org.apache.geode.cache.query.data.Portfolio) Host(org.apache.geode.test.dunit.Host) LocalRegion(org.apache.geode.internal.cache.LocalRegion) CqExistsException(org.apache.geode.cache.query.CqExistsException) IgnoredException(org.apache.geode.test.dunit.IgnoredException) RMIException(org.apache.geode.test.dunit.RMIException) IOException(java.io.IOException) CacheException(org.apache.geode.cache.CacheException) ClientProxyMembershipID(org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID) AttributesFactory(org.apache.geode.cache.AttributesFactory) CqAttributesFactory(org.apache.geode.cache.query.CqAttributesFactory) PartitionAttributesFactory(org.apache.geode.cache.PartitionAttributesFactory) CacheSerializableRunnable(org.apache.geode.cache30.CacheSerializableRunnable) VM(org.apache.geode.test.dunit.VM) Iterator(java.util.Iterator) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList) CqQuery(org.apache.geode.cache.query.CqQuery) DefaultQueryService(org.apache.geode.cache.query.internal.DefaultQueryService) DistributedTest(org.apache.geode.test.junit.categories.DistributedTest) Test(org.junit.Test)

Example 18 with DefaultQueryService

use of org.apache.geode.cache.query.internal.DefaultQueryService in project geode by apache.

the class CqServiceVsdStats method numCqsOnRegion.

/**
   * This is a test method. It silently ignores exceptions and should not be used outside of unit
   * tests.
   * <p>
   * Returns the number of CQs (active + suspended) on the given region.
   */
public long numCqsOnRegion(final InternalCache cache, String regionName) {
    if (cache == null) {
        return 0;
    }
    DefaultQueryService queryService = (DefaultQueryService) cache.getQueryService();
    CqService cqService = null;
    try {
        cqService = queryService.getCqService();
    } catch (CqException e) {
        if (logger.isDebugEnabled()) {
            logger.debug("Failed to get CqService {}", e.getLocalizedMessage());
        }
        e.printStackTrace();
        // We're confused
        return -1;
    }
    if (((CqServiceImpl) cqService).isServer()) {
        // If we are on the server, look at the number of CQs in the filter profile.
        try {
            FilterProfile fp = cache.getFilterProfile(regionName);
            if (fp == null) {
                return 0;
            }
            return fp.getCqCount();
        } catch (Exception ex) {
            if (logger.isDebugEnabled()) {
                logger.debug("Failed to get serverside CQ count for region: {} {}", regionName, ex.getLocalizedMessage());
            }
        }
    } else {
        try {
            CqQuery[] cqs = queryService.getCqs(regionName);
            if (cqs != null) {
                return cqs.length;
            }
        } catch (Exception ex) {
        // Dont do anything.
        }
    }
    return 0;
}
Also used : FilterProfile(org.apache.geode.internal.cache.FilterProfile) CqException(org.apache.geode.cache.query.CqException) CqQuery(org.apache.geode.cache.query.CqQuery) DefaultQueryService(org.apache.geode.cache.query.internal.DefaultQueryService) CqException(org.apache.geode.cache.query.CqException)

Example 19 with DefaultQueryService

use of org.apache.geode.cache.query.internal.DefaultQueryService in project geode by apache.

the class CqPerfUsingPoolDUnitTest method testKeyMaintenance.

/**
   * Test for maintaining keys for update optimization.
   * 
   * @throws Exception
   */
@Test
public void testKeyMaintenance() throws Exception {
    final Host host = Host.getHost(0);
    VM server = host.getVM(0);
    VM client = host.getVM(1);
    cqDUnitTest.createServer(server);
    final int port = server.invoke(() -> CqQueryUsingPoolDUnitTest.getCacheServerPort());
    final String host0 = NetworkUtils.getServerHostName(server.getHost());
    // cqDUnitTest.createClient(client, port, host0);
    String poolName = "testKeyMaintainance";
    cqDUnitTest.createPool(client, poolName, host0, port);
    // HashSet for caching purpose will be created for cqs.
    final int cqSize = 2;
    // Cq1
    cqDUnitTest.createCQ(client, poolName, "testKeyMaintainance_0", cqDUnitTest.cqs[0]);
    cqDUnitTest.executeCQ(client, "testKeyMaintainance_0", false, null);
    // Cq2
    cqDUnitTest.createCQ(client, poolName, "testKeyMaintainance_1", cqDUnitTest.cqs[10]);
    cqDUnitTest.executeCQ(client, "testKeyMaintainance_1", false, null);
    cqDUnitTest.createValues(server, cqDUnitTest.regions[0], 1);
    cqDUnitTest.waitForCreated(client, "testKeyMaintainance_0", CqQueryUsingPoolDUnitTest.KEY + 1);
    // Entry is made into the CQs cache hashset.
    // testKeyMaintainance_0 with 1 entry and testKeyMaintainance_1 with 0
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeys1") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 1, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_1 is wrong.", 0, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // Update 1.
    cqDUnitTest.createValues(server, cqDUnitTest.regions[0], 10);
    cqDUnitTest.waitForCreated(client, "testKeyMaintainance_0", CqQueryDUnitTest.KEY + 10);
    // Entry/check is made into the CQs cache hashset.
    // testKeyMaintainance_0 with 1 entry and testKeyMaintainance_1 with 1
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeysAfterUpdate1") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 10, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_1 is wrong.", 5, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // Update.
    cqDUnitTest.createValues(server, cqDUnitTest.regions[0], 12);
    cqDUnitTest.waitForCreated(client, "testKeyMaintainance_0", CqQueryDUnitTest.KEY + 12);
    // Entry/check is made into the CQs cache hashset.
    // testKeyMaintainance_0 with 1 entry and testKeyMaintainance_1 with 1
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeysAfterUpdate2") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 12, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_1 is wrong.", 6, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // Delete.
    cqDUnitTest.deleteValues(server, cqDUnitTest.regions[0], 6);
    cqDUnitTest.waitForDestroyed(client, "testKeyMaintainance_0", CqQueryDUnitTest.KEY + 6);
    // Entry/check is made into the CQs cache hashset.
    // testKeyMaintainance_0 with 1 entry and testKeyMaintainance_1 with 1
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeysAfterUpdate2") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 6, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_1 is wrong.", 3, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // This should still needs to process the events so that Results are uptodate.
    cqDUnitTest.stopCQ(client, "testKeyMaintainance_1");
    cqDUnitTest.createValues(server, cqDUnitTest.regions[0], 12);
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeysAfterUpdate2") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 12, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_1 is wrong.", 6, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // This should re-start the caching for this CQ.
    cqDUnitTest.executeCQ(client, "testKeyMaintainance_1", false, null);
    // This will remove the caching for this CQ.
    cqDUnitTest.closeCQ(client, "testKeyMaintainance_1");
    server.invoke(new CacheSerializableRunnable("LookForCachedEventKeysAfterUpdate2") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                String serverCqName = (String) cqQuery.getServerCqName();
                if (serverCqName.startsWith("testKeyMaintainance_0")) {
                    assertEquals("The number of keys cached for cq testKeyMaintainance_0 is wrong.", 12, cqQuery.getCqResultKeysSize());
                } else if (serverCqName.startsWith("testKeyMaintainance_1")) {
                    fail("The key maintainance should not be present for this CQ.");
                }
            }
        }
    });
    // Close.
    cqDUnitTest.closeClient(client);
    cqDUnitTest.closeServer(server);
}
Also used : CacheSerializableRunnable(org.apache.geode.cache30.CacheSerializableRunnable) CacheException(org.apache.geode.cache.CacheException) VM(org.apache.geode.test.dunit.VM) Collection(java.util.Collection) Host(org.apache.geode.test.dunit.Host) InternalCqQuery(org.apache.geode.cache.query.internal.cq.InternalCqQuery) CqService(org.apache.geode.cache.query.internal.cq.CqService) DefaultQueryService(org.apache.geode.cache.query.internal.DefaultQueryService) ServerCQImpl(org.apache.geode.cache.query.internal.cq.ServerCQImpl) CacheException(org.apache.geode.cache.CacheException) Test(org.junit.Test) DistributedTest(org.apache.geode.test.junit.categories.DistributedTest)

Example 20 with DefaultQueryService

use of org.apache.geode.cache.query.internal.DefaultQueryService in project geode by apache.

the class CqResultSetUsingPoolDUnitTest method testCqResultsCaching.

/**
   * Tests CQ Result Set.
   * 
   * @throws Exception
   */
@Test
public void testCqResultsCaching() throws Exception {
    final Host host = Host.getHost(0);
    VM server = host.getVM(0);
    VM client = host.getVM(1);
    cqDUnitTest.createServer(server);
    final int port = server.invoke(() -> CqQueryUsingPoolDUnitTest.getCacheServerPort());
    final String host0 = NetworkUtils.getServerHostName(server.getHost());
    String poolName = "testCqResults";
    final String cqName = "testCqResultsP_0";
    cqDUnitTest.createPool(client, poolName, host0, port);
    // Create client.
    cqDUnitTest.createClient(client, port, host0);
    // create CQ.
    cqDUnitTest.createCQ(client, poolName, cqName, cqDUnitTest.cqs[0]);
    final int numObjects = 300;
    final int totalObjects = 500;
    // initialize Region.
    server.invoke(new CacheSerializableRunnable("Update Region") {

        public void run2() throws CacheException {
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            for (int i = 1; i <= numObjects; i++) {
                Portfolio p = new Portfolio(i);
                region.put("" + i, p);
            }
        }
    });
    // Keep updating region (async invocation).
    server.invokeAsync(new CacheSerializableRunnable("Update Region") {

        public void run2() throws CacheException {
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            // Update (totalObjects - 1) entries.
            for (int i = 1; i < totalObjects; i++) {
                // Destroy entries.
                if (i > 25 && i < 201) {
                    region.destroy("" + i);
                    continue;
                }
                Portfolio p = new Portfolio(i);
                region.put("" + i, p);
            }
            // recreate destroyed entries.
            for (int j = 26; j < 201; j++) {
                Portfolio p = new Portfolio(j);
                region.put("" + j, p);
            }
            // Add the last key.
            Portfolio p = new Portfolio(totalObjects);
            region.put("" + totalObjects, p);
        }
    });
    // Execute CQ.
    // While region operation is in progress execute CQ.
    cqDUnitTest.executeCQ(client, cqName, true, null);
    // Verify CQ Cache results.
    server.invoke(new CacheSerializableRunnable("Verify CQ Cache results") {

        public void run2() throws CacheException {
            CqService cqService = null;
            try {
                cqService = ((DefaultQueryService) getCache().getQueryService()).getCqService();
            } catch (Exception ex) {
                LogWriterUtils.getLogWriter().info("Failed to get the internal CqService.", ex);
                Assert.fail("Failed to get the internal CqService.", ex);
            }
            // Wait till all the region update is performed.
            Region region = getCache().getRegion("/root/" + cqDUnitTest.regions[0]);
            while (true) {
                if (region.get("" + totalObjects) == null) {
                    try {
                        Thread.sleep(50);
                    } catch (Exception ex) {
                    // ignore.
                    }
                    continue;
                }
                break;
            }
            Collection<? extends InternalCqQuery> cqs = cqService.getAllCqs();
            for (InternalCqQuery cq : cqs) {
                ServerCQImpl cqQuery = (ServerCQImpl) cq;
                if (cqQuery.getName().equals(cqName)) {
                    int size = cqQuery.getCqResultKeysSize();
                    if (size != totalObjects) {
                        LogWriterUtils.getLogWriter().info("The number of Cached events " + size + " is not equal to the expected size " + totalObjects);
                        HashSet expectedKeys = new HashSet();
                        for (int i = 1; i < totalObjects; i++) {
                            expectedKeys.add("" + i);
                        }
                        Set cachedKeys = cqQuery.getCqResultKeyCache();
                        expectedKeys.removeAll(cachedKeys);
                        LogWriterUtils.getLogWriter().info("Missing keys from the Cache : " + expectedKeys);
                    }
                    assertEquals("The number of keys cached for cq " + cqName + " is wrong.", totalObjects, cqQuery.getCqResultKeysSize());
                }
            }
        }
    });
    // Close.
    cqDUnitTest.closeClient(client);
    cqDUnitTest.closeServer(server);
}
Also used : HashSet(java.util.HashSet) Set(java.util.Set) CacheException(org.apache.geode.cache.CacheException) Portfolio(org.apache.geode.cache.query.data.Portfolio) Host(org.apache.geode.test.dunit.Host) CqService(org.apache.geode.cache.query.internal.cq.CqService) ServerCQImpl(org.apache.geode.cache.query.internal.cq.ServerCQImpl) CacheException(org.apache.geode.cache.CacheException) CacheSerializableRunnable(org.apache.geode.cache30.CacheSerializableRunnable) VM(org.apache.geode.test.dunit.VM) Region(org.apache.geode.cache.Region) Collection(java.util.Collection) InternalCqQuery(org.apache.geode.cache.query.internal.cq.InternalCqQuery) DefaultQueryService(org.apache.geode.cache.query.internal.DefaultQueryService) HashSet(java.util.HashSet) FlakyTest(org.apache.geode.test.junit.categories.FlakyTest) Test(org.junit.Test) DistributedTest(org.apache.geode.test.junit.categories.DistributedTest)

Aggregations

DefaultQueryService (org.apache.geode.cache.query.internal.DefaultQueryService)22 CacheException (org.apache.geode.cache.CacheException)15 CacheSerializableRunnable (org.apache.geode.cache30.CacheSerializableRunnable)14 CqService (org.apache.geode.cache.query.internal.cq.CqService)11 Collection (java.util.Collection)10 InternalCqQuery (org.apache.geode.cache.query.internal.cq.InternalCqQuery)9 Test (org.junit.Test)9 CqException (org.apache.geode.cache.query.CqException)8 ServerCQImpl (org.apache.geode.cache.query.internal.cq.ServerCQImpl)8 Host (org.apache.geode.test.dunit.Host)8 VM (org.apache.geode.test.dunit.VM)8 DistributedTest (org.apache.geode.test.junit.categories.DistributedTest)8 IOException (java.io.IOException)7 Portfolio (org.apache.geode.cache.query.data.Portfolio)6 FlakyTest (org.apache.geode.test.junit.categories.FlakyTest)6 Set (java.util.Set)5 Region (org.apache.geode.cache.Region)5 QueryService (org.apache.geode.cache.query.QueryService)5 HashSet (java.util.HashSet)4 ArrayList (java.util.ArrayList)3