| /* |
| * 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. |
| */ |
| |
| #include <gfcpp/gf_base.hpp> |
| |
| #include "fw_dunit.hpp" |
| |
| #ifdef WIN32 |
| |
| #define CLIENT1 s1p1 |
| DUNIT_TASK_DEFINITION(CLIENT1, CREATECLIENT) |
| { LOG("This test doesn't run on windows. Too many classes to export."); } |
| END_TASK_DEFINITION |
| void runTask() { CALL_TASK(CREATECLIENT); } |
| DUNIT_MAIN |
| { runTask(); } |
| END_MAIN |
| |
| #else |
| |
| //#define BUILD_CPPCACHE 1 |
| #include <gfcpp/GeodeCppCache.hpp> |
| #include <LRUEntriesMap.hpp> |
| #include <LRUMapEntry.hpp> |
| #include <LRUExpMapEntry.hpp> |
| #include <VersionTag.hpp> |
| #include <stdlib.h> |
| #include <ClientProxyMembershipID.hpp> |
| #include <ace/OS.h> |
| #include <string> |
| #include <vector> |
| #include <LocalRegion.hpp> |
| #include <gfcpp/DataInput.hpp> |
| #include "DeltaEx.hpp" |
| #include "CacheableToken.hpp" |
| #include "DiskStoreId.hpp" |
| #include "DiskVersionTag.hpp" |
| #include "DSMemberForVersionStamp.hpp" |
| #include "CachePerfStats.hpp" |
| #define ROOT_SCOPE LOCAL |
| |
| #include "CacheHelper.hpp" |
| |
| #define CLIENT1 s1p1 |
| |
| using namespace apache::geode::client; |
| using namespace test; |
| |
| CacheHelper* cacheHelper = NULL; |
| RegionPtr regPtr; |
| |
| const char* endpoints = NULL; |
| |
| void initClient() { |
| if (cacheHelper == NULL) { |
| PropertiesPtr configPtr = Properties::create(); |
| configPtr->insert("tombstone-timeout", 5000); |
| cacheHelper = new CacheHelper(true, configPtr); |
| } |
| ASSERT(cacheHelper, "Failed to create a CacheHelper client instance."); |
| } |
| void cleanProc() { |
| if (cacheHelper != NULL) { |
| delete cacheHelper; |
| cacheHelper = NULL; |
| } |
| } |
| |
| CacheHelper* getHelper() { |
| ASSERT(cacheHelper != NULL, "No cacheHelper initialized."); |
| return cacheHelper; |
| } |
| |
| void createRegion(const char* name, bool ackMode, |
| bool clientNotificationEnabled = false, bool caching = true) { |
| LOG("createRegion() entered."); |
| fprintf(stdout, "Creating region -- %s ackMode is %d\n", name, ackMode); |
| fflush(stdout); |
| // ack, caching |
| regPtr = |
| getHelper()->createRegion(name, ackMode, caching, NULLPTR, |
| clientNotificationEnabled, true, true, 5000); |
| ASSERT(regPtr != NULLPTR, "Failed to create region."); |
| LOG("Region created."); |
| } |
| |
| typedef std::vector<MapEntryImplPtr> VectorOfMapEntry; |
| |
| CacheableStringPtr createCacheable(const char* value) { |
| CacheableStringPtr result = CacheableString::create(value); |
| ASSERT(result != NULLPTR, "expected result non-NULL"); |
| return result; |
| } |
| |
| uint8_t addr1[6] = {0xff, 0xff, 0xff, 0xaa, 0xff, 0xff}; |
| uint8_t addr2[6] = {0xff, 0xff, 0xff, 0xaa, 0xff, 0xbb}; |
| uint8_t addr3[6] = {0xff, 0xff, 0xaa, 0xaa, 0xff, 0xff}; |
| uint8_t addr4[6] = {0xff, 0xff, 0xff, 0xff, 0xaa, 0xff}; |
| |
| ClientProxyMembershipIDPtr member_host1( |
| new ClientProxyMembershipID(addr1, 6, 80, "", "myuniquetag", 0)); |
| ClientProxyMembershipIDPtr member_host12( |
| new ClientProxyMembershipID(addr1, 6, 80, "", "myuniquetah", 0)); |
| ClientProxyMembershipIDPtr member_host13( |
| new ClientProxyMembershipID(addr1, 6, 81, "", "myuniquetag", 0)); |
| ClientProxyMembershipIDPtr member_host14( |
| new ClientProxyMembershipID(addr1, 6, 88, "", "myuniquetag", 0)); |
| ClientProxyMembershipIDPtr member_host15( |
| new ClientProxyMembershipID(addr2, 6, 88, "", "myuniquetag", 0)); |
| ClientProxyMembershipIDPtr member_host16( |
| new ClientProxyMembershipID(addr3, 6, 88, "", "myuniquetag", 0)); |
| ClientProxyMembershipIDPtr member_host17( |
| new ClientProxyMembershipID(addr4, 6, 88, "", "myuniquetag", 0)); |
| DiskStoreId* diskStore17 = new DiskStoreId(1, 7); |
| DiskStoreId* diskStore18 = new DiskStoreId(1, 8); |
| DiskStoreId* diskStore27 = new DiskStoreId(2, 7); |
| ClientProxyMembershipIDPtr member_host_vmview5( |
| new ClientProxyMembershipID(addr4, 6, 88, "", "", 5)); |
| ClientProxyMembershipIDPtr member_host_vmview6( |
| new ClientProxyMembershipID(addr4, 6, 88, "", "", 6)); |
| ClientProxyMembershipIDPtr member_host_vmview7( |
| new ClientProxyMembershipID(addr4, 6, 88, "", "", 7)); |
| |
| uint16_t host1; |
| uint16_t host12; |
| uint16_t host13; |
| uint16_t host14; |
| uint16_t host15; |
| uint16_t host16; |
| uint16_t host17; |
| uint16_t disk17; |
| uint16_t disk18; |
| uint16_t disk27; |
| uint16_t hostVmview5; |
| uint16_t hostVmview6; |
| uint16_t hostVmview7; |
| |
| int DeltaEx::toDeltaCount = 0; |
| int DeltaEx::toDataCount = 0; |
| int DeltaEx::fromDeltaCount = 0; |
| int DeltaEx::fromDataCount = 0; |
| int DeltaEx::cloneCount = 0; |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, CREATECLIENT) |
| { |
| initClient(); |
| createRegion("myregion", true, false); |
| LOG("StepOne complete."); |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, CloseCache1) |
| { cleanProc(); } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepOne_AddHosts) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| host1 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host1); |
| host12 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host12); |
| host13 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host13); |
| host14 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host14); |
| host15 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host15); |
| host16 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host16); |
| host17 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host17); |
| disk17 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| DSMemberForVersionStampPtr(diskStore17)); |
| disk18 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| DSMemberForVersionStampPtr(diskStore18)); |
| disk27 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| DSMemberForVersionStampPtr(diskStore27)); |
| hostVmview5 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host_vmview5); |
| hostVmview6 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host_vmview6); |
| hostVmview7 = lregPtr->getCacheImpl()->getMemberListForVersionStamp()->add( |
| member_host_vmview7); |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepTwo_TestPut) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr = CacheableKey::create((char*)"key1"); |
| ASSERT(keyPtr != NULLPTR, "expected keyPtr non-NULL"); |
| MapEntryImplPtr me; |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| VersionTagPtr versionTag13(new VersionTag(5, 6, 7, host13, 0)); |
| VersionTagPtr versionTag14(new VersionTag(5, 6, 7, host14, 0)); |
| VersionTagPtr versionTag15(new VersionTag(5, 6, 7, host15, 0)); |
| VersionTagPtr versionTag16(new VersionTag(5, 6, 7, host16, 0)); |
| VersionTagPtr versionTag17(new VersionTag(5, 6, 7, host17, 0)); |
| |
| CacheablePtr oldValue; |
| entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| char log[256]; |
| |
| GfErrType err = |
| entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag13); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| uint32_t conflatedEvents = |
| lregPtr->getCacheImpl()->m_cacheStats->getConflatedEvents(); |
| ASSERT(conflatedEvents == 2, "conflated events should be 2"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag14); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag15); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag16); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag17); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 7, "an exception"); |
| |
| VersionTagPtr versionTag18(new VersionTag(0xffffaa, 6, 7, host1, 0)); |
| |
| // version rollover, this will not be applied |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 7, "an exception"); |
| |
| CacheableKeyPtr keyPtr2 = CacheableKey::create((char*)"Key2"); |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 1, "an exception"); |
| |
| // version rollover, this will be applied |
| err = entries->put(keyPtr2, ct1, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 2, "an exception"); |
| |
| // Null version tag, this will be applied |
| VersionTagPtr versionTag19; |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err != GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| // inserts a null tag |
| CacheableKeyPtr keyPtr3 = CacheableKey::create((char*)"Key3"); |
| err = entries->put(keyPtr3, ct1, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 0, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 0, "an exception"); |
| |
| // inserts an entry with version stamp, the previous entry is without |
| // version |
| // stamp, |
| // should be allowed. |
| err = entries->put(keyPtr3, ct1, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| try { |
| Serializable::registerType(DeltaEx::create); |
| } catch (IllegalStateException&) { |
| // ignore exception caused by type reregistration. |
| } |
| DeltaEx::toDeltaCount = 0; |
| DeltaEx::toDataCount = 0; |
| sprintf(log, "Some delta tests..."); |
| LOG(log); |
| |
| CacheableKeyPtr keyPtr4 = CacheableKey::create((char*)"Key4"); |
| DeltaEx* ptr = new DeltaEx(); |
| CacheablePtr valPtr(ptr); |
| err = entries->put(keyPtr4, valPtr, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| ASSERT(DeltaEx::fromDeltaCount == 0, " Delta count should have been 0 "); |
| |
| DeltaEx* ptr1 = new DeltaEx(); |
| ptr1->setDelta(true); |
| CacheablePtr valPtr1(ptr1); |
| DataOutput doutput; |
| doutput.writeInt(1); |
| const uint8_t* buffer = doutput.getBuffer(); |
| |
| DataInput datainput(buffer, doutput.getBufferLength()); |
| |
| bool isUpdate; |
| VersionTagPtr versionTag12plus(new VersionTag(6, 6, 7, host13, host12)); |
| err = entries->put(keyPtr4, valPtr1, me, oldValue, -1, 0, versionTag12plus, |
| isUpdate, &datainput); |
| |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 3, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 6, "an exception"); |
| ASSERT(DeltaEx::fromDeltaCount == 1, " Delta count should have been 1 "); |
| |
| // Delta update, Not allowed as same tag and stamp versions |
| err = entries->put(keyPtr4, valPtr1, me, oldValue, -1, 0, versionTag12plus, |
| isUpdate, &datainput); |
| ASSERT(err == GF_INVALID_DELTA, "an exception"); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 3, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 6, "an exception"); |
| ASSERT(DeltaEx::fromDeltaCount == 1, " Delta count should have been 1 "); |
| |
| // Delta update, Not allowed as delta based on a different host version |
| // different |
| VersionTagPtr versionTag12pp(new VersionTag(7, 6, 7, host13, host12)); |
| err = entries->put(keyPtr4, valPtr1, me, oldValue, -1, 0, versionTag12plus, |
| isUpdate, &datainput); |
| ASSERT(err == GF_INVALID_DELTA, "an exception"); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 3, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 6, "an exception"); |
| ASSERT(DeltaEx::fromDeltaCount == 1, " Delta count should have been 1 "); |
| |
| DeltaEx* ptr2 = new DeltaEx(); |
| ptr2->setDelta(true); |
| CacheablePtr valPtr2(ptr2); |
| DataOutput doutput1; |
| doutput1.writeInt(1); |
| const uint8_t* buffer1 = doutput1.getBuffer(); |
| DataInput datainput1(buffer1, doutput1.getBufferLength()); |
| DeltaEx::fromDeltaCount = 0; |
| // Delta update, allowed as delta based on correct host version different |
| VersionTagPtr versionTag12pp1(new VersionTag(7, 6, 7, host14, host13)); |
| err = entries->put(keyPtr4, valPtr2, me, oldValue, -1, 0, versionTag12pp1, |
| isUpdate, &datainput1); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 4, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 7, "an exception"); |
| ASSERT(DeltaEx::fromDeltaCount == 1, " Delta count should have been 1 "); |
| |
| /******* Test disk version tags*****************/ |
| VersionTagPtr versiondiskTag17(new DiskVersionTag(5, 6, 7, disk17, 0)); |
| VersionTagPtr versiondiskTag18(new DiskVersionTag(5, 6, 7, disk18, 0)); |
| VersionTagPtr versiondiskTag27(new DiskVersionTag(5, 6, 7, disk27, 0)); |
| CacheableKeyPtr keydiskPtr = CacheableKey::create((char*)"keydisk1"); |
| err = entries->put(keydiskPtr, ct, me, oldValue, -1, 0, versiondiskTag17); |
| err = entries->put(keydiskPtr, ct1, me, oldValue, -1, 0, versiondiskTag27); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keydiskPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == disk27, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| err = entries->put(keydiskPtr, ct, me, oldValue, -1, 0, versiondiskTag18); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keydiskPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == disk27, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| /********* Test with vm view ids ****************/ |
| VersionTagPtr versionvmviewTag5(new VersionTag(5, 6, 7, hostVmview5, 0)); |
| VersionTagPtr versionvmviewTag6(new VersionTag(5, 6, 7, hostVmview6, 0)); |
| VersionTagPtr versionvmviewTag7(new VersionTag(5, 6, 7, hostVmview7, 0)); |
| CacheableKeyPtr keyvmviewPtr = CacheableKey::create((char*)"keyvm1"); |
| err = |
| entries->put(keyvmviewPtr, ct, me, oldValue, -1, 0, versionvmviewTag5); |
| |
| err = |
| entries->put(keyvmviewPtr, ct1, me, oldValue, -1, 0, versionvmviewTag7); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyvmviewPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == hostVmview7, |
| "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| err = |
| entries->put(keyvmviewPtr, ct, me, oldValue, -1, 0, versionvmviewTag6); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyvmviewPtr, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == hostVmview7, |
| "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| sprintf(log, "Put test complete. %d", err); |
| LOG(log); |
| |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| DUNIT_TASK_DEFINITION(CLIENT1, StepThree_TestCreate) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr4 = CacheableKey::create((char*)"key4"); |
| ASSERT(keyPtr4 != NULLPTR, "expected keyPtr non-NULL"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| |
| /*new VersionTag(int32_t entryVersion, |
| int16_t regionVersionHighBytes, int32_t regionVersionLowBytes, |
| uint16_t internalMemId, uint16_t previousMemId) */ |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| VersionTagPtr versionTag13(new VersionTag(5, 6, 7, host13, 0)); |
| VersionTagPtr versionTag14(new VersionTag(5, 6, 7, host14, 0)); |
| VersionTagPtr versionTag15(new VersionTag(5, 6, 7, host15, 0)); |
| VersionTagPtr versionTag16(new VersionTag(5, 6, 7, host16, 0)); |
| VersionTagPtr versionTag17(new VersionTag(5, 6, 7, host17, 0)); |
| |
| CacheablePtr oldValue; |
| entries->create(keyPtr4, ct, me, oldValue, -1, 0, versionTag1); |
| entries->getEntry(keyPtr4, result, value); |
| ASSERT(me->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 1, "an exception"); |
| |
| char log[256]; |
| |
| CacheableKeyPtr keyPtr = CacheableKey::create((char*)"Key"); |
| GfErrType err = |
| entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag13); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag14); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag15); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, NULLPTR, me, oldValue, -1, 0, versionTag16); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->create(keyPtr, ct1, me, oldValue, -1, 0, versionTag17); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 7, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| VersionTagPtr versionTag18(new VersionTag(0xffffaa, 6, 7, host1, 0)); |
| |
| CacheableKeyPtr keyPtr2 = CacheableKey::create((char*)"Key2"); |
| err = entries->create(keyPtr2, NULLPTR, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| // version rollover, this will be applied |
| err = entries->create(keyPtr2, NULLPTR, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| // Null version tag, this will be applied |
| VersionTagPtr versionTag19; |
| err = entries->create(keyPtr2, ct, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| // inserts a null tag |
| CacheableKeyPtr keyPtr3 = CacheableKey::create((char*)"Key3"); |
| err = entries->create(keyPtr3, NULLPTR, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| |
| // inserts an entry with version stamp, the previous entry is without |
| // version |
| // stamp, |
| // should be allowed. |
| err = entries->create(keyPtr3, ct1, me, oldValue, -1, 0, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| sprintf(log, "Create test complete. %d", err); |
| LOG(log); |
| |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepEight_TestLRUEntries) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = LRUExpEntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new LRUEntriesMap(entryFactory, lregPtr, |
| LRUAction::DESTROY, 50000, true); |
| entries->open(); |
| CacheableKeyPtr keyPtr4 = CacheableKey::create((char*)"key4"); |
| CacheableKeyPtr keyPtr5 = CacheableKey::create((char*)"key5"); |
| CacheableKeyPtr keyPtr6 = CacheableKey::create((char*)"key6"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| char log[256]; |
| |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| entries->put(keyPtr4, ct, me, value, -1, 0, versionTag1); |
| |
| GfErrType err = |
| entries->remove(keyPtr4, value, me, -1, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| bool isTombstone; |
| err = entries->isTombstone(keyPtr4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| entries->put(keyPtr5, ct, me, value, -1, 0, versionTag1); |
| |
| err = entries->invalidate(keyPtr5, me, value, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr5, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| |
| entries->put(keyPtr6, ct, me, value, -1, 0, versionTag1); |
| |
| ASSERT(entries->get(keyPtr4, value, result) == false, "an exception"); |
| ASSERT(entries->get(keyPtr6, value, result) == true, "an exception"); |
| |
| sprintf(log, "LRUentriesMap test complete. %d", err); |
| LOG(log); |
| |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepFive_TestTombstoneExpiry) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr4 = CacheableKey::create((char*)"key4"); |
| CacheableKeyPtr keyPtr5 = CacheableKey::create((char*)"key5"); |
| CacheableKeyPtr keyPtr6 = CacheableKey::create((char*)"key6"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| char log[256]; |
| |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| entries->put(keyPtr4, ct, me, value, -1, 0, versionTag1); |
| |
| GfErrType err = |
| entries->remove(keyPtr4, value, me, -1, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| bool isTombstone; |
| err = entries->isTombstone(keyPtr4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| entries->put(keyPtr5, ct, me, value, -1, 0, versionTag1); |
| |
| err = entries->remove(keyPtr5, value, me, -1, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| entries->put(keyPtr6, ct, me, value, -1, 0, versionTag1); |
| uint32_t tombstone_count = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneCount(); |
| uint64_t tombstone_size = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneSize(); |
| |
| sprintf(log, |
| "Before expiry, Tombstone size: %" PRId64 " Tombstone count: %d", |
| tombstone_size, tombstone_count); |
| LOG(log); |
| ASSERT(tombstone_count > 0, "Tombstone count should be equal to 2"); |
| ASSERT(tombstone_size > 160, |
| "Tombstone size should be greater than 160 bytes. 160 is a approx " |
| "figure for tombstone overhead"); |
| |
| ACE_OS::sleep(8); |
| |
| err = entries->isTombstone(keyPtr5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtr5, value, result) == false, "an exception"); |
| err = entries->isTombstone(keyPtr4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtr4, value, result) == false, "an exception"); |
| |
| uint32_t tombstone_count_after = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneCount(); |
| uint64_t tombstone_size_after = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneSize(); |
| |
| sprintf(log, |
| "After expiry, Tombstone size: %" PRId64 " Tombstone count: %d", |
| tombstone_size_after, tombstone_count_after); |
| LOG(log); |
| |
| ASSERT((tombstone_count - 2) == tombstone_count_after, |
| "Tombstone count does not match"); |
| ASSERT((tombstone_size - 160) > tombstone_size_after, |
| "Tombstone size does not match"); |
| |
| sprintf(log, "Tombstone expiry test complete. %d", err); |
| LOG(log); |
| |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepSix_TestInvalidate) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr = CacheableKey::create((char*)"key1"); |
| ASSERT(keyPtr != NULLPTR, "expected keyPtr non-NULL"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| VersionTagPtr versionTag13(new VersionTag(5, 6, 7, host13, 0)); |
| VersionTagPtr versionTag14(new VersionTag(5, 6, 7, host14, 0)); |
| VersionTagPtr versionTag15(new VersionTag(5, 6, 7, host15, 0)); |
| VersionTagPtr versionTag16(new VersionTag(5, 6, 7, host16, 0)); |
| VersionTagPtr versionTag17(new VersionTag(5, 6, 7, host17, 0)); |
| VersionTagPtr versionTag22(new VersionTag(9, 10, 10, host12, 0)); |
| |
| CacheablePtr oldValue; |
| entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| char log[256]; |
| |
| GfErrType err = entries->invalidate(keyPtr, me, oldValue, versionTag12); |
| |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag13); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) != true, "an exception"); |
| |
| err = entries->invalidate(keyPtr, me, oldValue, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) != true, "an exception"); |
| |
| err = entries->invalidate(keyPtr, me, oldValue, versionTag14); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| |
| err = entries->invalidate(keyPtr, me, oldValue, versionTag17); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 7, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| |
| err = entries->invalidate(keyPtr, me, oldValue, versionTag22); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| |
| VersionTagPtr versionTag18(new VersionTag(0xffffaa, 6, 7, host1, 0)); |
| |
| // version rollover, this will not be applied |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| |
| CacheableKeyPtr keyPtr2 = CacheableKey::create((char*)"Key2"); |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 1, "an exception"); |
| |
| // version rollover, this will be applied |
| err = entries->invalidate(keyPtr2, me, oldValue, versionTag22); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| |
| // Null version tag, this will be applied |
| VersionTagPtr versionTag19; |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag19); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(CacheableToken::isInvalid(value) != true, "an exception"); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| |
| // inserts a null tag |
| CacheableKeyPtr keyPtr3 = CacheableKey::create((char*)"Key3"); |
| err = entries->put(keyPtr3, ct1, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 0, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 0, "an exception"); |
| |
| // removes an entry with version tag, the previous entry is without version |
| // stamp, |
| // should be allowed. |
| err = entries->invalidate(keyPtr3, me, oldValue, versionTag12); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(CacheableToken::isInvalid(value) == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| delete entries; |
| sprintf(log, "Invalidate test complete. %d", err); |
| LOG(log); |
| } |
| END_TASK_DEFINITION |
| |
| DUNIT_TASK_DEFINITION(CLIENT1, StepSeven_TestGetsAfterRemove) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr4 = CacheableKey::create((char*)"key4"); |
| CacheableKeyPtr keyPtr5 = CacheableKey::create((char*)"key5"); |
| CacheableKeyPtr keyPtr6 = CacheableKey::create((char*)"key6"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| char log[256]; |
| |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| VersionTagPtr versionTag22(new VersionTag(6, 6, 7, host12, 0)); |
| |
| entries->put(keyPtr4, ct, me, value, -1, 0, versionTag1); |
| |
| GfErrType err = |
| entries->remove(keyPtr4, value, me, -1, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| bool isTombstone; |
| err = entries->isTombstone(keyPtr4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| entries->put(keyPtr5, ct, me, value, -1, 0, versionTag1); |
| |
| err = entries->remove(keyPtr5, value, me, -1, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| entries->put(keyPtr6, ct, me, value, -1, 0, versionTag1); |
| |
| ASSERT(entries->containsKey(keyPtr6) == true, "an exception"); |
| ASSERT(entries->containsKey(keyPtr5) == false, "an exception"); |
| ASSERT(entries->containsKey(keyPtr4) == false, "an exception"); |
| ASSERT(entries->get(keyPtr4, value, result) == false, "an exception"); |
| ASSERT(entries->get(keyPtr5, value, result) == false, "an exception"); |
| ASSERT(entries->get(keyPtr6, value, result) == true, "an exception"); |
| |
| VectorOfCacheable values; |
| entries->values(values); |
| ASSERT(values.length() == 1, "an exception"); |
| |
| VectorOfCacheableKey keys; |
| entries->keys(keys); |
| ASSERT(keys.length() == 1, "an exception"); |
| |
| VectorOfRegionEntry regionEntries; |
| entries->entries(regionEntries); |
| ASSERT(regionEntries.length() == 1, "an exception"); |
| |
| entries->put(keyPtr5, ct, me, value, -1, 0, versionTag22); |
| |
| ASSERT(entries->containsKey(keyPtr6) == true, "an exception"); |
| ASSERT(entries->containsKey(keyPtr5) == true, "an exception"); |
| ASSERT(entries->containsKey(keyPtr4) == false, "an exception"); |
| ASSERT(entries->get(keyPtr4, value, result) == false, "an exception"); |
| ASSERT(entries->get(keyPtr5, value, result) == true, "an exception"); |
| ASSERT(entries->get(keyPtr6, value, result) == true, "an exception"); |
| |
| entries->values(values); |
| ASSERT(values.length() == 2, "an exception"); |
| |
| entries->keys(keys); |
| ASSERT(keys.length() == 2, "an exception"); |
| |
| entries->entries(regionEntries); |
| ASSERT(regionEntries.length() == 2, "an exception"); |
| |
| sprintf(log, "TestGetsAfterRemove test complete. %d", err); |
| LOG(log); |
| |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| DUNIT_TASK_DEFINITION(CLIENT1, StepFour_TestRemove) |
| { |
| LocalRegion* lregPtr = (dynamic_cast<LocalRegion*>(regPtr.ptr())); |
| CacheableStringPtr ccstr = createCacheable("100"); |
| CacheablePtr ct = ccstr; |
| CacheableStringPtr ccstr1 = createCacheable("500"); |
| CacheablePtr ct1 = ccstr1; |
| EntryFactory* entryFactory = EntryFactory::singleton; |
| entryFactory->setConcurrencyChecksEnabled(true); |
| EntriesMap* entries = new ConcurrentEntriesMap(entryFactory, true, lregPtr); |
| entries->open(); |
| CacheableKeyPtr keyPtr = CacheableKey::create((char*)"key1"); |
| ASSERT(keyPtr != NULLPTR, "expected keyPtr non-NULL"); |
| MapEntryImplPtr me; |
| MapEntryImplPtr result; |
| CacheablePtr value; |
| |
| VersionTagPtr versionTag1(new VersionTag(5, 6, 7, host1, 0)); |
| |
| VersionTagPtr versionTag12(new VersionTag(5, 6, 7, host12, 0)); |
| |
| VersionTagPtr versionTag13(new VersionTag(5, 6, 7, host13, 0)); |
| VersionTagPtr versionTag14(new VersionTag(5, 6, 7, host14, 0)); |
| VersionTagPtr versionTag15(new VersionTag(5, 6, 7, host15, 0)); |
| VersionTagPtr versionTag16(new VersionTag(5, 6, 7, host16, 0)); |
| VersionTagPtr versionTag17(new VersionTag(5, 6, 7, host17, 0)); |
| VersionTagPtr versionTag22(new VersionTag(9, 10, 10, host12, 0)); |
| |
| CacheablePtr oldValue; |
| entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| char log[256]; |
| |
| GfErrType err = |
| entries->remove(keyPtr, oldValue, me, -1, versionTag12, false); |
| |
| ASSERT(err == GF_NOERR, "an exception"); |
| bool isTombstone; |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr, result, value); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| uint32_t tombstone_count = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneCount(); |
| uint64_t tombstone_size = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneSize(); |
| |
| sprintf(log, "After tombstone creation, Tombstone size: %" PRId64 |
| " Tombstone count: %d", |
| tombstone_size, tombstone_count); |
| LOG(log); |
| ASSERT(tombstone_count == 1, "Tombstone count should be equal to 1"); |
| ASSERT(tombstone_size > 70, |
| "Tombstone size should be greater than 70 bytes. 70 is an approx " |
| "figure for tombstone overhead"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag13); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| |
| tombstone_count = |
| lregPtr->getCacheImpl()->m_cacheStats->getTombstoneCount(); |
| tombstone_size = lregPtr->getCacheImpl()->m_cacheStats->getTombstoneSize(); |
| |
| sprintf(log, |
| "After converting tombstone into an entry, Tombstone size: %" PRId64 |
| " Tombstone count: %d", |
| tombstone_size, tombstone_count); |
| LOG(log); |
| ASSERT(tombstone_count == 0, "Tombstone count should be equal to 0"); |
| ASSERT(tombstone_size == 0, "Tombstone size should be 0"); |
| |
| err = entries->remove(keyPtr, oldValue, me, -1, versionTag1, false); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtr, value, result) == true, "an exception"); |
| |
| err = entries->remove(keyPtr, oldValue, me, -1, versionTag14, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 4, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| ASSERT(entries->get(keyPtr, value, result) == false, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct1, me, oldValue, -1, 0, versionTag15); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag1); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->remove(keyPtr, oldValue, me, -1, versionTag16, false); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| |
| err = entries->remove(keyPtr, oldValue, me, -1, versionTag17, false); |
| ASSERT(err == GF_CACHE_ENTRY_NOT_FOUND, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 7, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| ASSERT(entries->get(keyPtr, value, result) == false, "an exception"); |
| |
| err = entries->remove(keyPtr, oldValue, me, -1, versionTag22, false); |
| ASSERT(err == GF_CACHE_ENTRY_NOT_FOUND, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| ASSERT(entries->get(keyPtr, value, result) == false, "an exception"); |
| |
| VersionTagPtr versionTag18(new VersionTag(0xffffaa, 6, 7, host1, 0)); |
| |
| // version rollover, this will not be applied |
| err = entries->put(keyPtr, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_CACHE_CONCURRENT_MODIFICATION_EXCEPTION, "an exception"); |
| err = entries->isTombstone(keyPtr, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| ASSERT(entries->get(keyPtr, value, result) == false, "an exception"); |
| |
| CacheableKeyPtr keyPtr2 = CacheableKey::create((char*)"Key2"); |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag18); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(me->getVersionStamp().getMemberId() == 1, "an exception"); |
| |
| // version rollover, this will be applied |
| err = entries->remove(keyPtr2, oldValue, me, -1, versionTag22, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr2, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| ASSERT(entries->get(keyPtr2, value, result) == false, "an exception"); |
| |
| // Null version tag, this will be applied |
| VersionTagPtr versionTag19; |
| err = entries->put(keyPtr2, ct, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr2, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 100, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 9, "an exception"); |
| |
| // inserts a null tag |
| CacheableKeyPtr keyPtr3 = CacheableKey::create((char*)"Key3"); |
| err = entries->put(keyPtr3, ct1, me, oldValue, -1, 0, versionTag19); |
| ASSERT(err == GF_NOERR, "an exception"); |
| entries->getEntry(keyPtr3, result, value); |
| ASSERT(atoi(value->toString()->asChar()) == 500, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 0, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 0, "an exception"); |
| |
| // removes an entry with version tag, the previous entry is without version |
| // stamp, |
| // should be allowed. |
| err = entries->remove(keyPtr3, oldValue, me, 0, versionTag12, false); |
| ASSERT(err == GF_NOERR, "an exception"); |
| err = entries->isTombstone(keyPtr3, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(result->getVersionStamp().getMemberId() == 2, "an exception"); |
| ASSERT(result->getVersionStamp().getEntryVersion() == 5, "an exception"); |
| ASSERT(entries->get(keyPtr3, value, result) == false, "an exception"); |
| |
| CacheableKeyPtr keyPtrR2 = CacheableKey::create((char*)"keyPtrR2"); |
| CacheableKeyPtr keyPtrR3 = CacheableKey::create((char*)"keyPtrR3"); |
| CacheableKeyPtr keyPtrR4 = CacheableKey::create((char*)"keyPtrR4"); |
| CacheableKeyPtr keyPtrR5 = CacheableKey::create((char*)"keyPtrR5"); |
| CacheableKeyPtr keyPtrR6 = CacheableKey::create((char*)"keyPtrR6"); |
| |
| CacheableKeyPtr keyPtrR21 = CacheableKey::create((char*)"keyPtrR21"); |
| CacheableKeyPtr keyPtrR31 = CacheableKey::create((char*)"keyPtrR31"); |
| CacheableKeyPtr keyPtrR41 = CacheableKey::create((char*)"keyPtrR41"); |
| CacheableKeyPtr keyPtrR51 = CacheableKey::create((char*)"keyPtrR51"); |
| CacheableKeyPtr keyPtrR61 = CacheableKey::create((char*)"keyPtrR61"); |
| |
| VersionTagPtr versionTag23(new VersionTag(9, 10, 10, host13, 0)); |
| VersionTagPtr versionTag24(new VersionTag(9, 10, 10, host14, 0)); |
| VersionTagPtr versionTag25(new VersionTag(9, 10, 10, host15, 0)); |
| VersionTagPtr versionTag26(new VersionTag(9, 10, 10, host16, 0)); |
| |
| sprintf(log, "Test reaping of tombstones"); |
| LOG(log); |
| |
| // add few entries with null version tags |
| err = entries->put(keyPtrR2, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR3, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR4, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR5, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR21, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR31, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR41, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR51, ct1, me, oldValue, -1, 0, versionTag19); |
| err = entries->put(keyPtrR61, ct1, me, oldValue, -1, 0, versionTag19); |
| |
| // remove those entries using non null version tags |
| err = entries->remove(keyPtrR2, oldValue, me, -1, versionTag12, false); |
| err = entries->remove(keyPtrR3, oldValue, me, -1, versionTag13, false); |
| err = entries->remove(keyPtrR4, oldValue, me, -1, versionTag14, false); |
| err = entries->remove(keyPtrR5, oldValue, me, -1, versionTag15, false); |
| err = entries->remove(keyPtrR21, oldValue, me, -1, versionTag22, false); |
| err = entries->remove(keyPtrR31, oldValue, me, -1, versionTag23, false); |
| err = entries->remove(keyPtrR41, oldValue, me, -1, versionTag24, false); |
| err = entries->remove(keyPtrR51, oldValue, me, -1, versionTag25, false); |
| err = entries->remove(keyPtrR61, oldValue, me, -1, versionTag26, false); |
| |
| // test if all of them have been converted into tombstones. |
| err = entries->isTombstone(keyPtrR2, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR3, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR21, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR31, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR41, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR51, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| |
| // generate dummy gc versions |
| std::map<uint16_t, int64_t> gcVersions; |
| int64_t temp = 3; |
| temp = temp << 32; |
| gcVersions[1] = temp; |
| gcVersions[2] = temp; |
| temp = 11; |
| temp = temp << 32; |
| gcVersions[3] = temp; |
| temp = 9; |
| temp = temp << 32; |
| gcVersions[4] = temp; |
| temp = 10; |
| temp = temp << 32; |
| gcVersions[5] = temp; |
| |
| // reap entries based on gc versions |
| entries->reapTombstones(gcVersions); |
| |
| // make sure entries are reaped |
| err = entries->isTombstone(keyPtrR2, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(entries->get(keyPtrR2, value, result) == false, "an exception"); |
| err = entries->isTombstone(keyPtrR3, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtrR3, value, result) == false, "an exception"); |
| err = entries->isTombstone(keyPtrR4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtrR4, value, result) == false, "an exception"); |
| |
| err = entries->isTombstone(keyPtrR5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtrR5, value, result) == false, "an exception"); |
| |
| err = entries->isTombstone(keyPtrR21, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(entries->get(keyPtrR21, value, result) == false, "an exception"); |
| |
| err = entries->isTombstone(keyPtrR31, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| ASSERT(entries->get(keyPtrR31, value, result) == false, "an exception"); |
| |
| err = entries->isTombstone(keyPtrR41, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(entries->get(keyPtrR41, value, result) == false, "an exception"); |
| |
| err = entries->isTombstone(keyPtrR51, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| ASSERT(entries->get(keyPtrR51, value, result) == false, "an exception"); |
| |
| sprintf(log, "Remove test complete. %d", err); |
| LOG(log); |
| // reap using removedKeys API |
| CacheableKeyPtr keyPtrR71 = CacheableKey::create((char*)"keyPtrR71"); |
| CacheableHashSetPtr removedKeys = CacheableHashSet::create(); |
| removedKeys->insert(keyPtrR3); |
| removedKeys->insert(keyPtrR71); |
| removedKeys->insert(keyPtrR2); |
| removedKeys->insert(keyPtrR41); |
| |
| // reap entries based keys |
| entries->reapTombstones(removedKeys); |
| |
| // make sure entries are reaped |
| err = entries->isTombstone(keyPtrR2, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR3, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR4, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR5, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR21, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| err = entries->isTombstone(keyPtrR31, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR41, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == false, "an exception"); |
| err = entries->isTombstone(keyPtrR51, result, isTombstone); |
| ASSERT(err == GF_NOERR, "an exception"); |
| ASSERT(isTombstone == true, "an exception"); |
| delete entries; |
| } |
| END_TASK_DEFINITION |
| void runTask() { |
| CALL_TASK(CREATECLIENT); |
| CALL_TASK(StepOne_AddHosts); |
| CALL_TASK(StepTwo_TestPut); |
| CALL_TASK(StepThree_TestCreate); |
| CALL_TASK(StepFour_TestRemove); |
| CALL_TASK(StepFive_TestTombstoneExpiry); |
| CALL_TASK(StepSix_TestInvalidate); |
| CALL_TASK(StepSeven_TestGetsAfterRemove); |
| CALL_TASK(StepEight_TestLRUEntries); |
| CALL_TASK(CloseCache1); |
| } |
| |
| DUNIT_MAIN |
| { runTask(); } |
| END_MAIN |
| |
| #endif |