blob: f044520caa3845860e451ae425e64c105b86a2c5 [file] [log] [blame]
/*
* 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