You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2015/07/09 19:02:23 UTC
[05/57] [partial] incubator-geode git commit: Initial import of
geode-1.0.0.0-SNAPSHOT-2. All the new sub-project directories (like jvsd)
were not imported. A diff was done to confirm that this commit is exactly the
same as the open directory the snapsho
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapStringKey2.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapStringKey2.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapStringKey2.java
new file mode 100644
index 0000000..d0cb194
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapStringKey2.java
@@ -0,0 +1,476 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.cache;
+// DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import com.gemstone.gemfire.cache.EntryEvent;
+import com.gemstone.gemfire.internal.cache.lru.EnableLRU;
+import com.gemstone.gemfire.internal.cache.persistence.DiskRecoveryStore;
+import com.gemstone.gemfire.internal.InternalStatisticsDisabledException;
+import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
+import com.gemstone.gemfire.internal.cache.versions.VersionSource;
+import com.gemstone.gemfire.internal.cache.versions.VersionStamp;
+import com.gemstone.gemfire.internal.cache.versions.VersionTag;
+import com.gemstone.gemfire.internal.offheap.OffHeapRegionEntryHelper;
+import com.gemstone.gemfire.internal.offheap.annotations.Released;
+import com.gemstone.gemfire.internal.offheap.annotations.Retained;
+import com.gemstone.gemfire.internal.offheap.annotations.Unretained;
+import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMap.HashEntry;
+// macros whose definition changes this class:
+// disk: DISK
+// lru: LRU
+// stats: STATS
+// versioned: VERSIONED
+// offheap: OFFHEAP
+// One of the following key macros must be defined:
+// key object: KEY_OBJECT
+// key int: KEY_INT
+// key long: KEY_LONG
+// key uuid: KEY_UUID
+// key string1: KEY_STRING1
+// key string2: KEY_STRING2
+/**
+ * Do not modify this class. It was generated.
+ * Instead modify LeafRegionEntry.cpp and then run
+ * bin/generateRegionEntryClasses.sh from the directory
+ * that contains your build.xml.
+ */
+public class VersionedStatsDiskRegionEntryOffHeapStringKey2 extends VersionedStatsDiskRegionEntryOffHeap {
+ public VersionedStatsDiskRegionEntryOffHeapStringKey2 (RegionEntryContext context, String key,
+ @Retained
+ Object value
+ , boolean byteEncode
+ ) {
+ super(context,
+ (value instanceof RecoveredEntry ? null : value)
+ );
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ initialize(context, value);
+ // caller has already confirmed that key.length <= MAX_INLINE_STRING_KEY
+ long tmpBits1 = 0L;
+ long tmpBits2 = 0L;
+ if (byteEncode) {
+ for (int i=key.length()-1; i >= 0; i--) {
+ // Note: we know each byte is <= 0x7f so the "& 0xff" is not needed. But I added it in to keep findbugs happy.
+ if (i < 7) {
+ tmpBits1 |= (byte)key.charAt(i) & 0xff;
+ tmpBits1 <<= 8;
+ } else {
+ tmpBits2 <<= 8;
+ tmpBits2 |= (byte)key.charAt(i) & 0xff;
+ }
+ }
+ tmpBits1 |= 1<<6;
+ } else {
+ for (int i=key.length()-1; i >= 0; i--) {
+ if (i < 3) {
+ tmpBits1 |= key.charAt(i);
+ tmpBits1 <<= 16;
+ } else {
+ tmpBits2 <<= 16;
+ tmpBits2 |= key.charAt(i);
+ }
+ }
+ }
+ tmpBits1 |= key.length();
+ this.bits1 = tmpBits1;
+ this.bits2 = tmpBits2;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // common code
+ protected int hash;
+ private HashEntry<Object, Object> next;
+ @SuppressWarnings("unused")
+ private volatile long lastModified;
+ private static final AtomicLongFieldUpdater<VersionedStatsDiskRegionEntryOffHeapStringKey2> lastModifiedUpdater
+ = AtomicLongFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapStringKey2.class, "lastModified");
+ /**
+ * All access done using ohAddrUpdater so it is used even though the compiler can not tell it is.
+ */
+ @SuppressWarnings("unused")
+ @Retained @Released private volatile long ohAddress;
+ /**
+ * I needed to add this because I wanted clear to call setValue which normally can only be called while the re is synced.
+ * But if I sync in that code it causes a lock ordering deadlock with the disk regions because they also get a rw lock in clear.
+ * Some hardware platforms do not support CAS on a long. If gemfire is run on one of those the AtomicLongFieldUpdater does a sync
+ * on the re and we will once again be deadlocked.
+ * I don't know if we support any of the hardware platforms that do not have a 64bit CAS. If we do then we can expect deadlocks
+ * on disk regions.
+ */
+ private final static AtomicLongFieldUpdater<VersionedStatsDiskRegionEntryOffHeapStringKey2> ohAddrUpdater = AtomicLongFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapStringKey2.class, "ohAddress");
+ @Override
+ public Token getValueAsToken() {
+ return OffHeapRegionEntryHelper.getValueAsToken(this);
+ }
+ @Override
+ protected Object getValueField() {
+ return OffHeapRegionEntryHelper._getValue(this);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ @Unretained
+ protected void setValueField(@Unretained Object v) {
+ OffHeapRegionEntryHelper.setValue(this, v);
+ }
+ @Override
+ @Retained
+ public Object _getValueRetain(RegionEntryContext context, boolean decompress) {
+ return OffHeapRegionEntryHelper._getValueRetain(this, decompress, context);
+ }
+ @Override
+ public long getAddress() {
+ return ohAddrUpdater.get(this);
+ }
+ @Override
+ public boolean setAddress(long expectedAddr, long newAddr) {
+ return ohAddrUpdater.compareAndSet(this, expectedAddr, newAddr);
+ }
+ @Override
+ @Released
+ public void release() {
+ OffHeapRegionEntryHelper.releaseEntry(this);
+ }
+ @Override
+ public void returnToPool() {
+ // Deadcoded for now; never was working
+// if (this instanceof VMThinRegionEntryLongKey) {
+// factory.returnToPool((VMThinRegionEntryLongKey)this);
+// }
+ }
+ protected long getlastModifiedField() {
+ return lastModifiedUpdater.get(this);
+ }
+ protected boolean compareAndSetLastModifiedField(long expectedValue, long newValue) {
+ return lastModifiedUpdater.compareAndSet(this, expectedValue, newValue);
+ }
+ /**
+ * @see HashEntry#getEntryHash()
+ */
+ public final int getEntryHash() {
+ return this.hash;
+ }
+ protected void setEntryHash(int v) {
+ this.hash = v;
+ }
+ /**
+ * @see HashEntry#getNextEntry()
+ */
+ public final HashEntry<Object, Object> getNextEntry() {
+ return this.next;
+ }
+ /**
+ * @see HashEntry#setNextEntry
+ */
+ public final void setNextEntry(final HashEntry<Object, Object> n) {
+ this.next = n;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // disk code
+ protected void initialize(RegionEntryContext context, Object value) {
+ diskInitialize(context, value);
+ }
+ @Override
+ public int updateAsyncEntrySize(EnableLRU capacityController) {
+ throw new IllegalStateException("should never be called");
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ private void diskInitialize(RegionEntryContext context, Object value) {
+ DiskRecoveryStore drs = (DiskRecoveryStore)context;
+ DiskStoreImpl ds = drs.getDiskStore();
+ long maxOplogSize = ds.getMaxOplogSize();
+ //get appropriate instance of DiskId implementation based on maxOplogSize
+ this.id = DiskId.createDiskId(maxOplogSize, true/* is persistence */, ds.needsLinkedList());
+ Helper.initialize(this, drs, value);
+ }
+ /**
+ * DiskId
+ *
+ * @since 5.1
+ */
+ protected DiskId id;//= new DiskId();
+ public DiskId getDiskId() {
+ return this.id;
+ }
+ @Override
+ void setDiskId(RegionEntry old) {
+ this.id = ((AbstractDiskRegionEntry)old).getDiskId();
+ }
+// // inlining DiskId
+// // always have these fields
+// /**
+// * id consists of
+// * most significant
+// * 1 byte = users bits
+// * 2-8 bytes = oplog id
+// * least significant.
+// *
+// * The highest bit in the oplog id part is set to 1 if the oplog id
+// * is negative.
+// * @todo this field could be an int for an overflow only region
+// */
+// private long id;
+// /**
+// * Length of the bytes on disk.
+// * This is always set. If the value is invalid then it will be set to 0.
+// * The most significant bit is used by overflow to mark it as needing to be written.
+// */
+// protected int valueLength = 0;
+// // have intOffset or longOffset
+// // intOffset
+// /**
+// * The position in the oplog (the oplog offset) where this entry's value is
+// * stored
+// */
+// private volatile int offsetInOplog;
+// // longOffset
+// /**
+// * The position in the oplog (the oplog offset) where this entry's value is
+// * stored
+// */
+// private volatile long offsetInOplog;
+// // have overflowOnly or persistence
+// // overflowOnly
+// // no fields
+// // persistent
+// /** unique entry identifier * */
+// private long keyId;
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // stats code
+ @Override
+ public final void updateStatsForGet(boolean hit, long time)
+ {
+ setLastAccessed(time);
+ if (hit) {
+ incrementHitCount();
+ } else {
+ incrementMissCount();
+ }
+ }
+ @Override
+ protected final void setLastModified(long lastModified) {
+ _setLastModified(lastModified);
+ if (!DISABLE_ACCESS_TIME_UPDATE_ON_PUT) {
+ setLastAccessed(lastModified);
+ }
+ }
+ private volatile long lastAccessed;
+ private volatile int hitCount;
+ private volatile int missCount;
+ private static final AtomicIntegerFieldUpdater<VersionedStatsDiskRegionEntryOffHeapStringKey2> hitCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapStringKey2.class, "hitCount");
+ private static final AtomicIntegerFieldUpdater<VersionedStatsDiskRegionEntryOffHeapStringKey2> missCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapStringKey2.class, "missCount");
+ @Override
+ public final long getLastAccessed() throws InternalStatisticsDisabledException {
+ return this.lastAccessed;
+ }
+ private void setLastAccessed(long lastAccessed) {
+ this.lastAccessed = lastAccessed;
+ }
+ @Override
+ public final long getHitCount() throws InternalStatisticsDisabledException {
+ return this.hitCount & 0xFFFFFFFFL;
+ }
+ @Override
+ public final long getMissCount() throws InternalStatisticsDisabledException {
+ return this.missCount & 0xFFFFFFFFL;
+ }
+ private void incrementHitCount() {
+ hitCountUpdater.incrementAndGet(this);
+ }
+ private void incrementMissCount() {
+ missCountUpdater.incrementAndGet(this);
+ }
+ @Override
+ public final void resetCounts() throws InternalStatisticsDisabledException {
+ hitCountUpdater.set(this,0);
+ missCountUpdater.set(this,0);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ public final void txDidDestroy(long currTime) {
+ setLastModified(currTime);
+ setLastAccessed(currTime);
+ this.hitCount = 0;
+ this.missCount = 0;
+ }
+ @Override
+ public boolean hasStats() {
+ return true;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // versioned code
+ private VersionSource memberID;
+ private short entryVersionLowBytes;
+ private short regionVersionHighBytes;
+ private int regionVersionLowBytes;
+ private byte entryVersionHighByte;
+ private byte distributedSystemId;
+ public int getEntryVersion() {
+ return ((entryVersionHighByte << 16) & 0xFF0000) | (entryVersionLowBytes & 0xFFFF);
+ }
+ public long getRegionVersion() {
+ return (((long)regionVersionHighBytes) << 32) | (regionVersionLowBytes & 0x00000000FFFFFFFFL);
+ }
+ public long getVersionTimeStamp() {
+ return getLastModified();
+ }
+ public void setVersionTimeStamp(long time) {
+ setLastModified(time);
+ }
+ public VersionSource getMemberID() {
+ return this.memberID;
+ }
+ public int getDistributedSystemId() {
+ return this.distributedSystemId;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public void setVersions(VersionTag tag) {
+ this.memberID = tag.getMemberID();
+ int eVersion = tag.getEntryVersion();
+ this.entryVersionLowBytes = (short)(eVersion & 0xffff);
+ this.entryVersionHighByte = (byte)((eVersion & 0xff0000) >> 16);
+ this.regionVersionHighBytes = tag.getRegionVersionHighBytes();
+ this.regionVersionLowBytes = tag.getRegionVersionLowBytes();
+ if (!(tag.isGatewayTag()) && this.distributedSystemId == tag.getDistributedSystemId()) {
+ if (getVersionTimeStamp() <= tag.getVersionTimeStamp()) {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ } else {
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ }
+ } else {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ }
+ this.distributedSystemId = (byte)(tag.getDistributedSystemId() & 0xff);
+ }
+ public void setMemberID(VersionSource memberID) {
+ this.memberID = memberID;
+ }
+ @Override
+ public VersionStamp getVersionStamp() {
+ return this;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public VersionTag asVersionTag() {
+ VersionTag tag = VersionTag.create(memberID);
+ tag.setEntryVersion(getEntryVersion());
+ tag.setRegionVersion(this.regionVersionHighBytes, this.regionVersionLowBytes);
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ tag.setDistributedSystemId(this.distributedSystemId);
+ return tag;
+ }
+ public void processVersionTag(LocalRegion r, VersionTag tag,
+ boolean isTombstoneFromGII, boolean hasDelta,
+ VersionSource thisVM, InternalDistributedMember sender, boolean checkForConflicts) {
+ basicProcessVersionTag(r, tag, isTombstoneFromGII, hasDelta, thisVM, sender, checkForConflicts);
+ }
+ @Override
+ public void processVersionTag(EntryEvent cacheEvent) {
+ // this keeps Eclipse happy. without it the sender chain becomes confused
+ // while browsing this code
+ super.processVersionTag(cacheEvent);
+ }
+ /** get rvv internal high byte. Used by region entries for transferring to storage */
+ public short getRegionVersionHighBytes() {
+ return this.regionVersionHighBytes;
+ }
+ /** get rvv internal low bytes. Used by region entries for transferring to storage */
+ public int getRegionVersionLowBytes() {
+ return this.regionVersionLowBytes;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // key code
+ // strlen is encoded in lowest 6 bits (max strlen is 63)
+ // character encoding info is in bits 7 and 8
+ // The other bits are used to encoded character data.
+ private final long bits1;
+ // bits2 encodes character data
+ private final long bits2;
+ private int getKeyLength() {
+ return (int) (this.bits1 & 0x003fL);
+ }
+ private int getEncoding() {
+ // 0 means encoded as char
+ // 1 means encoded as bytes that are all <= 0x7f;
+ return (int) (this.bits1 >> 6) & 0x03;
+ }
+ @Override
+ public final Object getKey() {
+ int keylen = getKeyLength();
+ char[] chars = new char[keylen];
+ long tmpBits1 = this.bits1;
+ long tmpBits2 = this.bits2;
+ if (getEncoding() == 1) {
+ for (int i=0; i < keylen; i++) {
+ if (i < 7) {
+ tmpBits1 >>= 8;
+ chars[i] = (char) (tmpBits1 & 0x00ff);
+ } else {
+ chars[i] = (char) (tmpBits2 & 0x00ff);
+ tmpBits2 >>= 8;
+ }
+ }
+ } else {
+ for (int i=0; i < keylen; i++) {
+ if (i < 3) {
+ tmpBits1 >>= 16;
+ chars[i] = (char) (tmpBits1 & 0x00FFff);
+ } else {
+ chars[i] = (char) (tmpBits2 & 0x00FFff);
+ tmpBits2 >>= 16;
+ }
+ }
+ }
+ return new String(chars);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ public boolean isKeyEqual(Object k) {
+ if (k instanceof String) {
+ String str = (String)k;
+ int keylen = getKeyLength();
+ if (str.length() == keylen) {
+ long tmpBits1 = this.bits1;
+ long tmpBits2 = this.bits2;
+ if (getEncoding() == 1) {
+ for (int i=0; i < keylen; i++) {
+ char c;
+ if (i < 7) {
+ tmpBits1 >>= 8;
+ c = (char) (tmpBits1 & 0x00ff);
+ } else {
+ c = (char) (tmpBits2 & 0x00ff);
+ tmpBits2 >>= 8;
+ }
+ if (str.charAt(i) != c) {
+ return false;
+ }
+ }
+ } else {
+ for (int i=0; i < keylen; i++) {
+ char c;
+ if (i < 3) {
+ tmpBits1 >>= 16;
+ c = (char) (tmpBits1 & 0x00FFff);
+ } else {
+ c = (char) (tmpBits2 & 0x00FFff);
+ tmpBits2 >>= 16;
+ }
+ if (str.charAt(i) != c) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapUUIDKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapUUIDKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapUUIDKey.java
new file mode 100644
index 0000000..5ecc020
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsDiskRegionEntryOffHeapUUIDKey.java
@@ -0,0 +1,377 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.cache;
+// DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import com.gemstone.gemfire.cache.EntryEvent;
+import com.gemstone.gemfire.internal.cache.lru.EnableLRU;
+import com.gemstone.gemfire.internal.cache.persistence.DiskRecoveryStore;
+import com.gemstone.gemfire.internal.InternalStatisticsDisabledException;
+import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
+import com.gemstone.gemfire.internal.cache.versions.VersionSource;
+import com.gemstone.gemfire.internal.cache.versions.VersionStamp;
+import com.gemstone.gemfire.internal.cache.versions.VersionTag;
+import com.gemstone.gemfire.internal.offheap.OffHeapRegionEntryHelper;
+import com.gemstone.gemfire.internal.offheap.annotations.Released;
+import com.gemstone.gemfire.internal.offheap.annotations.Retained;
+import com.gemstone.gemfire.internal.offheap.annotations.Unretained;
+import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMap.HashEntry;
+// macros whose definition changes this class:
+// disk: DISK
+// lru: LRU
+// stats: STATS
+// versioned: VERSIONED
+// offheap: OFFHEAP
+// One of the following key macros must be defined:
+// key object: KEY_OBJECT
+// key int: KEY_INT
+// key long: KEY_LONG
+// key uuid: KEY_UUID
+// key string1: KEY_STRING1
+// key string2: KEY_STRING2
+/**
+ * Do not modify this class. It was generated.
+ * Instead modify LeafRegionEntry.cpp and then run
+ * bin/generateRegionEntryClasses.sh from the directory
+ * that contains your build.xml.
+ */
+public class VersionedStatsDiskRegionEntryOffHeapUUIDKey extends VersionedStatsDiskRegionEntryOffHeap {
+ public VersionedStatsDiskRegionEntryOffHeapUUIDKey (RegionEntryContext context, UUID key,
+ @Retained
+ Object value
+ ) {
+ super(context,
+ (value instanceof RecoveredEntry ? null : value)
+ );
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ initialize(context, value);
+ this.keyMostSigBits = key.getMostSignificantBits();
+ this.keyLeastSigBits = key.getLeastSignificantBits();
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // common code
+ protected int hash;
+ private HashEntry<Object, Object> next;
+ @SuppressWarnings("unused")
+ private volatile long lastModified;
+ private static final AtomicLongFieldUpdater<VersionedStatsDiskRegionEntryOffHeapUUIDKey> lastModifiedUpdater
+ = AtomicLongFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapUUIDKey.class, "lastModified");
+ /**
+ * All access done using ohAddrUpdater so it is used even though the compiler can not tell it is.
+ */
+ @SuppressWarnings("unused")
+ @Retained @Released private volatile long ohAddress;
+ /**
+ * I needed to add this because I wanted clear to call setValue which normally can only be called while the re is synced.
+ * But if I sync in that code it causes a lock ordering deadlock with the disk regions because they also get a rw lock in clear.
+ * Some hardware platforms do not support CAS on a long. If gemfire is run on one of those the AtomicLongFieldUpdater does a sync
+ * on the re and we will once again be deadlocked.
+ * I don't know if we support any of the hardware platforms that do not have a 64bit CAS. If we do then we can expect deadlocks
+ * on disk regions.
+ */
+ private final static AtomicLongFieldUpdater<VersionedStatsDiskRegionEntryOffHeapUUIDKey> ohAddrUpdater = AtomicLongFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapUUIDKey.class, "ohAddress");
+ @Override
+ public Token getValueAsToken() {
+ return OffHeapRegionEntryHelper.getValueAsToken(this);
+ }
+ @Override
+ protected Object getValueField() {
+ return OffHeapRegionEntryHelper._getValue(this);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ @Unretained
+ protected void setValueField(@Unretained Object v) {
+ OffHeapRegionEntryHelper.setValue(this, v);
+ }
+ @Override
+ @Retained
+ public Object _getValueRetain(RegionEntryContext context, boolean decompress) {
+ return OffHeapRegionEntryHelper._getValueRetain(this, decompress, context);
+ }
+ @Override
+ public long getAddress() {
+ return ohAddrUpdater.get(this);
+ }
+ @Override
+ public boolean setAddress(long expectedAddr, long newAddr) {
+ return ohAddrUpdater.compareAndSet(this, expectedAddr, newAddr);
+ }
+ @Override
+ @Released
+ public void release() {
+ OffHeapRegionEntryHelper.releaseEntry(this);
+ }
+ @Override
+ public void returnToPool() {
+ // Deadcoded for now; never was working
+// if (this instanceof VMThinRegionEntryLongKey) {
+// factory.returnToPool((VMThinRegionEntryLongKey)this);
+// }
+ }
+ protected long getlastModifiedField() {
+ return lastModifiedUpdater.get(this);
+ }
+ protected boolean compareAndSetLastModifiedField(long expectedValue, long newValue) {
+ return lastModifiedUpdater.compareAndSet(this, expectedValue, newValue);
+ }
+ /**
+ * @see HashEntry#getEntryHash()
+ */
+ public final int getEntryHash() {
+ return this.hash;
+ }
+ protected void setEntryHash(int v) {
+ this.hash = v;
+ }
+ /**
+ * @see HashEntry#getNextEntry()
+ */
+ public final HashEntry<Object, Object> getNextEntry() {
+ return this.next;
+ }
+ /**
+ * @see HashEntry#setNextEntry
+ */
+ public final void setNextEntry(final HashEntry<Object, Object> n) {
+ this.next = n;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // disk code
+ protected void initialize(RegionEntryContext context, Object value) {
+ diskInitialize(context, value);
+ }
+ @Override
+ public int updateAsyncEntrySize(EnableLRU capacityController) {
+ throw new IllegalStateException("should never be called");
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ private void diskInitialize(RegionEntryContext context, Object value) {
+ DiskRecoveryStore drs = (DiskRecoveryStore)context;
+ DiskStoreImpl ds = drs.getDiskStore();
+ long maxOplogSize = ds.getMaxOplogSize();
+ //get appropriate instance of DiskId implementation based on maxOplogSize
+ this.id = DiskId.createDiskId(maxOplogSize, true/* is persistence */, ds.needsLinkedList());
+ Helper.initialize(this, drs, value);
+ }
+ /**
+ * DiskId
+ *
+ * @since 5.1
+ */
+ protected DiskId id;//= new DiskId();
+ public DiskId getDiskId() {
+ return this.id;
+ }
+ @Override
+ void setDiskId(RegionEntry old) {
+ this.id = ((AbstractDiskRegionEntry)old).getDiskId();
+ }
+// // inlining DiskId
+// // always have these fields
+// /**
+// * id consists of
+// * most significant
+// * 1 byte = users bits
+// * 2-8 bytes = oplog id
+// * least significant.
+// *
+// * The highest bit in the oplog id part is set to 1 if the oplog id
+// * is negative.
+// * @todo this field could be an int for an overflow only region
+// */
+// private long id;
+// /**
+// * Length of the bytes on disk.
+// * This is always set. If the value is invalid then it will be set to 0.
+// * The most significant bit is used by overflow to mark it as needing to be written.
+// */
+// protected int valueLength = 0;
+// // have intOffset or longOffset
+// // intOffset
+// /**
+// * The position in the oplog (the oplog offset) where this entry's value is
+// * stored
+// */
+// private volatile int offsetInOplog;
+// // longOffset
+// /**
+// * The position in the oplog (the oplog offset) where this entry's value is
+// * stored
+// */
+// private volatile long offsetInOplog;
+// // have overflowOnly or persistence
+// // overflowOnly
+// // no fields
+// // persistent
+// /** unique entry identifier * */
+// private long keyId;
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // stats code
+ @Override
+ public final void updateStatsForGet(boolean hit, long time)
+ {
+ setLastAccessed(time);
+ if (hit) {
+ incrementHitCount();
+ } else {
+ incrementMissCount();
+ }
+ }
+ @Override
+ protected final void setLastModified(long lastModified) {
+ _setLastModified(lastModified);
+ if (!DISABLE_ACCESS_TIME_UPDATE_ON_PUT) {
+ setLastAccessed(lastModified);
+ }
+ }
+ private volatile long lastAccessed;
+ private volatile int hitCount;
+ private volatile int missCount;
+ private static final AtomicIntegerFieldUpdater<VersionedStatsDiskRegionEntryOffHeapUUIDKey> hitCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapUUIDKey.class, "hitCount");
+ private static final AtomicIntegerFieldUpdater<VersionedStatsDiskRegionEntryOffHeapUUIDKey> missCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsDiskRegionEntryOffHeapUUIDKey.class, "missCount");
+ @Override
+ public final long getLastAccessed() throws InternalStatisticsDisabledException {
+ return this.lastAccessed;
+ }
+ private void setLastAccessed(long lastAccessed) {
+ this.lastAccessed = lastAccessed;
+ }
+ @Override
+ public final long getHitCount() throws InternalStatisticsDisabledException {
+ return this.hitCount & 0xFFFFFFFFL;
+ }
+ @Override
+ public final long getMissCount() throws InternalStatisticsDisabledException {
+ return this.missCount & 0xFFFFFFFFL;
+ }
+ private void incrementHitCount() {
+ hitCountUpdater.incrementAndGet(this);
+ }
+ private void incrementMissCount() {
+ missCountUpdater.incrementAndGet(this);
+ }
+ @Override
+ public final void resetCounts() throws InternalStatisticsDisabledException {
+ hitCountUpdater.set(this,0);
+ missCountUpdater.set(this,0);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ public final void txDidDestroy(long currTime) {
+ setLastModified(currTime);
+ setLastAccessed(currTime);
+ this.hitCount = 0;
+ this.missCount = 0;
+ }
+ @Override
+ public boolean hasStats() {
+ return true;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // versioned code
+ private VersionSource memberID;
+ private short entryVersionLowBytes;
+ private short regionVersionHighBytes;
+ private int regionVersionLowBytes;
+ private byte entryVersionHighByte;
+ private byte distributedSystemId;
+ public int getEntryVersion() {
+ return ((entryVersionHighByte << 16) & 0xFF0000) | (entryVersionLowBytes & 0xFFFF);
+ }
+ public long getRegionVersion() {
+ return (((long)regionVersionHighBytes) << 32) | (regionVersionLowBytes & 0x00000000FFFFFFFFL);
+ }
+ public long getVersionTimeStamp() {
+ return getLastModified();
+ }
+ public void setVersionTimeStamp(long time) {
+ setLastModified(time);
+ }
+ public VersionSource getMemberID() {
+ return this.memberID;
+ }
+ public int getDistributedSystemId() {
+ return this.distributedSystemId;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public void setVersions(VersionTag tag) {
+ this.memberID = tag.getMemberID();
+ int eVersion = tag.getEntryVersion();
+ this.entryVersionLowBytes = (short)(eVersion & 0xffff);
+ this.entryVersionHighByte = (byte)((eVersion & 0xff0000) >> 16);
+ this.regionVersionHighBytes = tag.getRegionVersionHighBytes();
+ this.regionVersionLowBytes = tag.getRegionVersionLowBytes();
+ if (!(tag.isGatewayTag()) && this.distributedSystemId == tag.getDistributedSystemId()) {
+ if (getVersionTimeStamp() <= tag.getVersionTimeStamp()) {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ } else {
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ }
+ } else {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ }
+ this.distributedSystemId = (byte)(tag.getDistributedSystemId() & 0xff);
+ }
+ public void setMemberID(VersionSource memberID) {
+ this.memberID = memberID;
+ }
+ @Override
+ public VersionStamp getVersionStamp() {
+ return this;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public VersionTag asVersionTag() {
+ VersionTag tag = VersionTag.create(memberID);
+ tag.setEntryVersion(getEntryVersion());
+ tag.setRegionVersion(this.regionVersionHighBytes, this.regionVersionLowBytes);
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ tag.setDistributedSystemId(this.distributedSystemId);
+ return tag;
+ }
+ public void processVersionTag(LocalRegion r, VersionTag tag,
+ boolean isTombstoneFromGII, boolean hasDelta,
+ VersionSource thisVM, InternalDistributedMember sender, boolean checkForConflicts) {
+ basicProcessVersionTag(r, tag, isTombstoneFromGII, hasDelta, thisVM, sender, checkForConflicts);
+ }
+ @Override
+ public void processVersionTag(EntryEvent cacheEvent) {
+ // this keeps Eclipse happy. without it the sender chain becomes confused
+ // while browsing this code
+ super.processVersionTag(cacheEvent);
+ }
+ /** get rvv internal high byte. Used by region entries for transferring to storage */
+ public short getRegionVersionHighBytes() {
+ return this.regionVersionHighBytes;
+ }
+ /** get rvv internal low bytes. Used by region entries for transferring to storage */
+ public int getRegionVersionLowBytes() {
+ return this.regionVersionLowBytes;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // key code
+ private final long keyMostSigBits;
+ private final long keyLeastSigBits;
+ @Override
+ public final Object getKey() {
+ return new UUID(this.keyMostSigBits, this.keyLeastSigBits);
+ }
+ @Override
+ public boolean isKeyEqual(Object k) {
+ if (k instanceof UUID) {
+ UUID uuid = (UUID)k;
+ return uuid.getLeastSignificantBits() == this.keyLeastSigBits && uuid.getMostSignificantBits() == this.keyMostSigBits;
+ }
+ return false;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeap.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeap.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeap.java
index fd77b8f..3d33f0a 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeap.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeap.java
@@ -53,5 +53,9 @@ public abstract class VersionedStatsLRURegionEntryHeap extends
public RegionEntryFactory makeVersioned() {
return this;
}
+ @Override
+ public RegionEntryFactory makeOnHeap() {
+ return this;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapIntKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapIntKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapIntKey.java
index f523730..c26fd87 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapIntKey.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapIntKey.java
@@ -24,6 +24,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -38,7 +39,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapIntKey extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapIntKey (RegionEntryContext context, int key, Object value
+ public VersionedStatsLRURegionEntryHeapIntKey (RegionEntryContext context, int key,
+ Object value
) {
super(context,
value
@@ -55,10 +57,12 @@ public class VersionedStatsLRURegionEntryHeapIntKey extends VersionedStatsLRUReg
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapIntKey> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapIntKey.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -102,8 +106,6 @@ public class VersionedStatsLRURegionEntryHeapIntKey extends VersionedStatsLRUReg
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapLongKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapLongKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapLongKey.java
index d134e63..603d8df 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapLongKey.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapLongKey.java
@@ -24,6 +24,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -38,7 +39,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapLongKey extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapLongKey (RegionEntryContext context, long key, Object value
+ public VersionedStatsLRURegionEntryHeapLongKey (RegionEntryContext context, long key,
+ Object value
) {
super(context,
value
@@ -55,10 +57,12 @@ public class VersionedStatsLRURegionEntryHeapLongKey extends VersionedStatsLRURe
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapLongKey> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapLongKey.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -102,8 +106,6 @@ public class VersionedStatsLRURegionEntryHeapLongKey extends VersionedStatsLRURe
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapObjectKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapObjectKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapObjectKey.java
index 0b857d1..cf7617e 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapObjectKey.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapObjectKey.java
@@ -24,6 +24,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -38,7 +39,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapObjectKey extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapObjectKey (RegionEntryContext context, Object key, Object value
+ public VersionedStatsLRURegionEntryHeapObjectKey (RegionEntryContext context, Object key,
+ Object value
) {
super(context,
value
@@ -55,10 +57,12 @@ public class VersionedStatsLRURegionEntryHeapObjectKey extends VersionedStatsLRU
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapObjectKey> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapObjectKey.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -102,8 +106,6 @@ public class VersionedStatsLRURegionEntryHeapObjectKey extends VersionedStatsLRU
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey1.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey1.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey1.java
index 11f6a3e..25db35b 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey1.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey1.java
@@ -24,6 +24,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -38,7 +39,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapStringKey1 extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapStringKey1 (RegionEntryContext context, String key, Object value
+ public VersionedStatsLRURegionEntryHeapStringKey1 (RegionEntryContext context, String key,
+ Object value
, boolean byteEncode
) {
super(context,
@@ -72,10 +74,12 @@ public class VersionedStatsLRURegionEntryHeapStringKey1 extends VersionedStatsLR
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapStringKey1> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapStringKey1.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -119,8 +123,6 @@ public class VersionedStatsLRURegionEntryHeapStringKey1 extends VersionedStatsLR
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey2.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey2.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey2.java
index d83141e..c51c991 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey2.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapStringKey2.java
@@ -24,6 +24,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -38,7 +39,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapStringKey2 extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapStringKey2 (RegionEntryContext context, String key, Object value
+ public VersionedStatsLRURegionEntryHeapStringKey2 (RegionEntryContext context, String key,
+ Object value
, boolean byteEncode
) {
super(context,
@@ -84,10 +86,12 @@ public class VersionedStatsLRURegionEntryHeapStringKey2 extends VersionedStatsLR
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapStringKey2> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapStringKey2.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -131,8 +135,6 @@ public class VersionedStatsLRURegionEntryHeapStringKey2 extends VersionedStatsLR
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapUUIDKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapUUIDKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapUUIDKey.java
index f018da8..3a5d1f6 100644
--- a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapUUIDKey.java
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryHeapUUIDKey.java
@@ -25,6 +25,7 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
// lru: LRU
// stats: STATS
// versioned: VERSIONED
+// offheap: OFFHEAP
// One of the following key macros must be defined:
// key object: KEY_OBJECT
// key int: KEY_INT
@@ -39,7 +40,8 @@ import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMa
* that contains your build.xml.
*/
public class VersionedStatsLRURegionEntryHeapUUIDKey extends VersionedStatsLRURegionEntryHeap {
- public VersionedStatsLRURegionEntryHeapUUIDKey (RegionEntryContext context, UUID key, Object value
+ public VersionedStatsLRURegionEntryHeapUUIDKey (RegionEntryContext context, UUID key,
+ Object value
) {
super(context,
value
@@ -57,10 +59,12 @@ public class VersionedStatsLRURegionEntryHeapUUIDKey extends VersionedStatsLRURe
private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryHeapUUIDKey> lastModifiedUpdater
= AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryHeapUUIDKey.class, "lastModified");
private volatile Object value;
- protected final Object areGetValue() {
+ @Override
+ protected final Object getValueField() {
return this.value;
}
- protected void areSetValue(Object v) {
+ @Override
+ protected void setValueField(Object v) {
this.value = v;
}
protected long getlastModifiedField() {
@@ -104,8 +108,6 @@ public class VersionedStatsLRURegionEntryHeapUUIDKey extends VersionedStatsLRURe
Object value) {
int oldSize = getEntrySize();
int newSize = capacityController.entrySize( getKeyForSizing(), value);
- // GemFireCacheImpl.getInstance().getLoggerI18n().info("DEBUG updateEntrySize: oldSize=" + oldSize
- // + " newSize=" + newSize);
setEntrySize(newSize);
int delta = newSize - oldSize;
// if ( debug ) log( "updateEntrySize key=" + getKey()
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeap.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeap.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeap.java
new file mode 100644
index 0000000..9acdb2c
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeap.java
@@ -0,0 +1,61 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.cache;
+
+import java.util.UUID;
+
+public abstract class VersionedStatsLRURegionEntryOffHeap extends
+ VersionedStatsLRURegionEntry implements OffHeapRegionEntry {
+ public VersionedStatsLRURegionEntryOffHeap(RegionEntryContext context, Object value) {
+ super(context, value);
+ }
+ private static final VersionedStatsLRURegionEntryOffHeapFactory factory = new VersionedStatsLRURegionEntryOffHeapFactory();
+
+ public static RegionEntryFactory getEntryFactory() {
+ return factory;
+ }
+ private static class VersionedStatsLRURegionEntryOffHeapFactory implements RegionEntryFactory {
+ public final RegionEntry createEntry(RegionEntryContext context, Object key, Object value) {
+ if (InlineKeyHelper.INLINE_REGION_KEYS) {
+ Class<?> keyClass = key.getClass();
+ if (keyClass == Integer.class) {
+ return new VersionedStatsLRURegionEntryOffHeapIntKey(context, (Integer)key, value);
+ } else if (keyClass == Long.class) {
+ return new VersionedStatsLRURegionEntryOffHeapLongKey(context, (Long)key, value);
+ } else if (keyClass == String.class) {
+ final String skey = (String) key;
+ final Boolean info = InlineKeyHelper.canStringBeInlineEncoded(skey);
+ if (info != null) {
+ final boolean byteEncoded = info;
+ if (skey.length() <= InlineKeyHelper.getMaxInlineStringKey(1, byteEncoded)) {
+ return new VersionedStatsLRURegionEntryOffHeapStringKey1(context, skey, value, byteEncoded);
+ } else {
+ return new VersionedStatsLRURegionEntryOffHeapStringKey2(context, skey, value, byteEncoded);
+ }
+ }
+ } else if (keyClass == UUID.class) {
+ return new VersionedStatsLRURegionEntryOffHeapUUIDKey(context, (UUID)key, value);
+ }
+ }
+ return new VersionedStatsLRURegionEntryOffHeapObjectKey(context, key, value);
+ }
+
+ public final Class getEntryClass() {
+ // The class returned from this method is used to estimate the memory size.
+ // TODO OFFHEAP: This estimate will not take into account the memory saved by inlining the keys.
+ return VersionedStatsLRURegionEntryOffHeapObjectKey.class;
+ }
+ public RegionEntryFactory makeVersioned() {
+ return this;
+ }
+ @Override
+ public RegionEntryFactory makeOnHeap() {
+ return VersionedStatsLRURegionEntryHeap.getEntryFactory();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapIntKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapIntKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapIntKey.java
new file mode 100644
index 0000000..9b549fe
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapIntKey.java
@@ -0,0 +1,381 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.cache;
+// DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import com.gemstone.gemfire.cache.EntryEvent;
+import com.gemstone.gemfire.internal.cache.lru.EnableLRU;
+import com.gemstone.gemfire.internal.InternalStatisticsDisabledException;
+import com.gemstone.gemfire.internal.cache.lru.LRUClockNode;
+import com.gemstone.gemfire.internal.cache.lru.NewLRUClockHand;
+import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
+import com.gemstone.gemfire.internal.cache.versions.VersionSource;
+import com.gemstone.gemfire.internal.cache.versions.VersionStamp;
+import com.gemstone.gemfire.internal.cache.versions.VersionTag;
+import com.gemstone.gemfire.internal.offheap.OffHeapRegionEntryHelper;
+import com.gemstone.gemfire.internal.offheap.annotations.Released;
+import com.gemstone.gemfire.internal.offheap.annotations.Retained;
+import com.gemstone.gemfire.internal.offheap.annotations.Unretained;
+import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMap.HashEntry;
+// macros whose definition changes this class:
+// disk: DISK
+// lru: LRU
+// stats: STATS
+// versioned: VERSIONED
+// offheap: OFFHEAP
+// One of the following key macros must be defined:
+// key object: KEY_OBJECT
+// key int: KEY_INT
+// key long: KEY_LONG
+// key uuid: KEY_UUID
+// key string1: KEY_STRING1
+// key string2: KEY_STRING2
+/**
+ * Do not modify this class. It was generated.
+ * Instead modify LeafRegionEntry.cpp and then run
+ * bin/generateRegionEntryClasses.sh from the directory
+ * that contains your build.xml.
+ */
+public class VersionedStatsLRURegionEntryOffHeapIntKey extends VersionedStatsLRURegionEntryOffHeap {
+ public VersionedStatsLRURegionEntryOffHeapIntKey (RegionEntryContext context, int key,
+ @Retained
+ Object value
+ ) {
+ super(context,
+ value
+ );
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ this.key = key;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // common code
+ protected int hash;
+ private HashEntry<Object, Object> next;
+ @SuppressWarnings("unused")
+ private volatile long lastModified;
+ private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryOffHeapIntKey> lastModifiedUpdater
+ = AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapIntKey.class, "lastModified");
+ /**
+ * All access done using ohAddrUpdater so it is used even though the compiler can not tell it is.
+ */
+ @SuppressWarnings("unused")
+ @Retained @Released private volatile long ohAddress;
+ /**
+ * I needed to add this because I wanted clear to call setValue which normally can only be called while the re is synced.
+ * But if I sync in that code it causes a lock ordering deadlock with the disk regions because they also get a rw lock in clear.
+ * Some hardware platforms do not support CAS on a long. If gemfire is run on one of those the AtomicLongFieldUpdater does a sync
+ * on the re and we will once again be deadlocked.
+ * I don't know if we support any of the hardware platforms that do not have a 64bit CAS. If we do then we can expect deadlocks
+ * on disk regions.
+ */
+ private final static AtomicLongFieldUpdater<VersionedStatsLRURegionEntryOffHeapIntKey> ohAddrUpdater = AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapIntKey.class, "ohAddress");
+ @Override
+ public Token getValueAsToken() {
+ return OffHeapRegionEntryHelper.getValueAsToken(this);
+ }
+ @Override
+ protected Object getValueField() {
+ return OffHeapRegionEntryHelper._getValue(this);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ @Unretained
+ protected void setValueField(@Unretained Object v) {
+ OffHeapRegionEntryHelper.setValue(this, v);
+ }
+ @Override
+ @Retained
+ public Object _getValueRetain(RegionEntryContext context, boolean decompress) {
+ return OffHeapRegionEntryHelper._getValueRetain(this, decompress, context);
+ }
+ @Override
+ public long getAddress() {
+ return ohAddrUpdater.get(this);
+ }
+ @Override
+ public boolean setAddress(long expectedAddr, long newAddr) {
+ return ohAddrUpdater.compareAndSet(this, expectedAddr, newAddr);
+ }
+ @Override
+ @Released
+ public void release() {
+ OffHeapRegionEntryHelper.releaseEntry(this);
+ }
+ @Override
+ public void returnToPool() {
+ // Deadcoded for now; never was working
+// if (this instanceof VMThinRegionEntryLongKey) {
+// factory.returnToPool((VMThinRegionEntryLongKey)this);
+// }
+ }
+ protected long getlastModifiedField() {
+ return lastModifiedUpdater.get(this);
+ }
+ protected boolean compareAndSetLastModifiedField(long expectedValue, long newValue) {
+ return lastModifiedUpdater.compareAndSet(this, expectedValue, newValue);
+ }
+ /**
+ * @see HashEntry#getEntryHash()
+ */
+ public final int getEntryHash() {
+ return this.hash;
+ }
+ protected void setEntryHash(int v) {
+ this.hash = v;
+ }
+ /**
+ * @see HashEntry#getNextEntry()
+ */
+ public final HashEntry<Object, Object> getNextEntry() {
+ return this.next;
+ }
+ /**
+ * @see HashEntry#setNextEntry
+ */
+ public final void setNextEntry(final HashEntry<Object, Object> n) {
+ this.next = n;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // lru code
+ @Override
+ public void setDelayedDiskId(LocalRegion r) {
+ // nothing needed for LRUs with no disk
+ }
+ public final synchronized int updateEntrySize(EnableLRU capacityController) {
+ return updateEntrySize(capacityController, _getValue()); // OFHEAP: _getValue ok w/o incing refcount because we are synced and only getting the size
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public final synchronized int updateEntrySize(EnableLRU capacityController,
+ Object value) {
+ int oldSize = getEntrySize();
+ int newSize = capacityController.entrySize( getKeyForSizing(), value);
+ setEntrySize(newSize);
+ int delta = newSize - oldSize;
+ // if ( debug ) log( "updateEntrySize key=" + getKey()
+ // + (_getValue() == Token.INVALID ? " invalid" :
+ // (_getValue() == Token.LOCAL_INVALID ? "local_invalid" :
+ // (_getValue()==null ? " evicted" : " valid")))
+ // + " oldSize=" + oldSize
+ // + " newSize=" + this.size );
+ return delta;
+ }
+ public final boolean testRecentlyUsed() {
+ return areAnyBitsSet(RECENTLY_USED);
+ }
+ @Override
+ public final void setRecentlyUsed() {
+ setBits(RECENTLY_USED);
+ }
+ public final void unsetRecentlyUsed() {
+ clearBits(~RECENTLY_USED);
+ }
+ public final boolean testEvicted() {
+ return areAnyBitsSet(EVICTED);
+ }
+ public final void setEvicted() {
+ setBits(EVICTED);
+ }
+ public final void unsetEvicted() {
+ clearBits(~EVICTED);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ private LRUClockNode nextLRU;
+ private LRUClockNode prevLRU;
+ private int size;
+ public final void setNextLRUNode( LRUClockNode next ) {
+ this.nextLRU = next;
+ }
+ public final LRUClockNode nextLRUNode() {
+ return this.nextLRU;
+ }
+ public final void setPrevLRUNode( LRUClockNode prev ) {
+ this.prevLRU = prev;
+ }
+ public final LRUClockNode prevLRUNode() {
+ return this.prevLRU;
+ }
+ public final int getEntrySize() {
+ return this.size;
+ }
+ protected final void setEntrySize(int size) {
+ this.size = size;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+//@Override
+//public StringBuilder appendFieldsToString(final StringBuilder sb) {
+// StringBuilder result = super.appendFieldsToString(sb);
+// result.append("; prev=").append(this.prevLRU==null?"null":"not null");
+// result.append("; next=").append(this.nextLRU==null?"null":"not null");
+// return result;
+//}
+ @Override
+ public Object getKeyForSizing() {
+ // inline keys always report null for sizing since the size comes from the entry size
+ return null;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // stats code
+ @Override
+ public final void updateStatsForGet(boolean hit, long time)
+ {
+ setLastAccessed(time);
+ if (hit) {
+ incrementHitCount();
+ } else {
+ incrementMissCount();
+ }
+ }
+ @Override
+ protected final void setLastModified(long lastModified) {
+ _setLastModified(lastModified);
+ if (!DISABLE_ACCESS_TIME_UPDATE_ON_PUT) {
+ setLastAccessed(lastModified);
+ }
+ }
+ private volatile long lastAccessed;
+ private volatile int hitCount;
+ private volatile int missCount;
+ private static final AtomicIntegerFieldUpdater<VersionedStatsLRURegionEntryOffHeapIntKey> hitCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapIntKey.class, "hitCount");
+ private static final AtomicIntegerFieldUpdater<VersionedStatsLRURegionEntryOffHeapIntKey> missCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapIntKey.class, "missCount");
+ @Override
+ public final long getLastAccessed() throws InternalStatisticsDisabledException {
+ return this.lastAccessed;
+ }
+ private void setLastAccessed(long lastAccessed) {
+ this.lastAccessed = lastAccessed;
+ }
+ @Override
+ public final long getHitCount() throws InternalStatisticsDisabledException {
+ return this.hitCount & 0xFFFFFFFFL;
+ }
+ @Override
+ public final long getMissCount() throws InternalStatisticsDisabledException {
+ return this.missCount & 0xFFFFFFFFL;
+ }
+ private void incrementHitCount() {
+ hitCountUpdater.incrementAndGet(this);
+ }
+ private void incrementMissCount() {
+ missCountUpdater.incrementAndGet(this);
+ }
+ @Override
+ public final void resetCounts() throws InternalStatisticsDisabledException {
+ hitCountUpdater.set(this,0);
+ missCountUpdater.set(this,0);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ public final void txDidDestroy(long currTime) {
+ setLastModified(currTime);
+ setLastAccessed(currTime);
+ this.hitCount = 0;
+ this.missCount = 0;
+ }
+ @Override
+ public boolean hasStats() {
+ return true;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // versioned code
+ private VersionSource memberID;
+ private short entryVersionLowBytes;
+ private short regionVersionHighBytes;
+ private int regionVersionLowBytes;
+ private byte entryVersionHighByte;
+ private byte distributedSystemId;
+ public int getEntryVersion() {
+ return ((entryVersionHighByte << 16) & 0xFF0000) | (entryVersionLowBytes & 0xFFFF);
+ }
+ public long getRegionVersion() {
+ return (((long)regionVersionHighBytes) << 32) | (regionVersionLowBytes & 0x00000000FFFFFFFFL);
+ }
+ public long getVersionTimeStamp() {
+ return getLastModified();
+ }
+ public void setVersionTimeStamp(long time) {
+ setLastModified(time);
+ }
+ public VersionSource getMemberID() {
+ return this.memberID;
+ }
+ public int getDistributedSystemId() {
+ return this.distributedSystemId;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public void setVersions(VersionTag tag) {
+ this.memberID = tag.getMemberID();
+ int eVersion = tag.getEntryVersion();
+ this.entryVersionLowBytes = (short)(eVersion & 0xffff);
+ this.entryVersionHighByte = (byte)((eVersion & 0xff0000) >> 16);
+ this.regionVersionHighBytes = tag.getRegionVersionHighBytes();
+ this.regionVersionLowBytes = tag.getRegionVersionLowBytes();
+ if (!(tag.isGatewayTag()) && this.distributedSystemId == tag.getDistributedSystemId()) {
+ if (getVersionTimeStamp() <= tag.getVersionTimeStamp()) {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ } else {
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ }
+ } else {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ }
+ this.distributedSystemId = (byte)(tag.getDistributedSystemId() & 0xff);
+ }
+ public void setMemberID(VersionSource memberID) {
+ this.memberID = memberID;
+ }
+ @Override
+ public VersionStamp getVersionStamp() {
+ return this;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public VersionTag asVersionTag() {
+ VersionTag tag = VersionTag.create(memberID);
+ tag.setEntryVersion(getEntryVersion());
+ tag.setRegionVersion(this.regionVersionHighBytes, this.regionVersionLowBytes);
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ tag.setDistributedSystemId(this.distributedSystemId);
+ return tag;
+ }
+ public void processVersionTag(LocalRegion r, VersionTag tag,
+ boolean isTombstoneFromGII, boolean hasDelta,
+ VersionSource thisVM, InternalDistributedMember sender, boolean checkForConflicts) {
+ basicProcessVersionTag(r, tag, isTombstoneFromGII, hasDelta, thisVM, sender, checkForConflicts);
+ }
+ @Override
+ public void processVersionTag(EntryEvent cacheEvent) {
+ // this keeps Eclipse happy. without it the sender chain becomes confused
+ // while browsing this code
+ super.processVersionTag(cacheEvent);
+ }
+ /** get rvv internal high byte. Used by region entries for transferring to storage */
+ public short getRegionVersionHighBytes() {
+ return this.regionVersionHighBytes;
+ }
+ /** get rvv internal low bytes. Used by region entries for transferring to storage */
+ public int getRegionVersionLowBytes() {
+ return this.regionVersionLowBytes;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // key code
+ private final int key;
+ @Override
+ public final Object getKey() {
+ return this.key;
+ }
+ @Override
+ public boolean isKeyEqual(Object k) {
+ if (k instanceof Integer) {
+ return ((Integer) k).intValue() == this.key;
+ }
+ return false;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapLongKey.java
----------------------------------------------------------------------
diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapLongKey.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapLongKey.java
new file mode 100644
index 0000000..bd04041
--- /dev/null
+++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedStatsLRURegionEntryOffHeapLongKey.java
@@ -0,0 +1,381 @@
+/*=========================================================================
+ * Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * one or more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+package com.gemstone.gemfire.internal.cache;
+// DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import com.gemstone.gemfire.cache.EntryEvent;
+import com.gemstone.gemfire.internal.cache.lru.EnableLRU;
+import com.gemstone.gemfire.internal.InternalStatisticsDisabledException;
+import com.gemstone.gemfire.internal.cache.lru.LRUClockNode;
+import com.gemstone.gemfire.internal.cache.lru.NewLRUClockHand;
+import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
+import com.gemstone.gemfire.internal.cache.versions.VersionSource;
+import com.gemstone.gemfire.internal.cache.versions.VersionStamp;
+import com.gemstone.gemfire.internal.cache.versions.VersionTag;
+import com.gemstone.gemfire.internal.offheap.OffHeapRegionEntryHelper;
+import com.gemstone.gemfire.internal.offheap.annotations.Released;
+import com.gemstone.gemfire.internal.offheap.annotations.Retained;
+import com.gemstone.gemfire.internal.offheap.annotations.Unretained;
+import com.gemstone.gemfire.internal.util.concurrent.CustomEntryConcurrentHashMap.HashEntry;
+// macros whose definition changes this class:
+// disk: DISK
+// lru: LRU
+// stats: STATS
+// versioned: VERSIONED
+// offheap: OFFHEAP
+// One of the following key macros must be defined:
+// key object: KEY_OBJECT
+// key int: KEY_INT
+// key long: KEY_LONG
+// key uuid: KEY_UUID
+// key string1: KEY_STRING1
+// key string2: KEY_STRING2
+/**
+ * Do not modify this class. It was generated.
+ * Instead modify LeafRegionEntry.cpp and then run
+ * bin/generateRegionEntryClasses.sh from the directory
+ * that contains your build.xml.
+ */
+public class VersionedStatsLRURegionEntryOffHeapLongKey extends VersionedStatsLRURegionEntryOffHeap {
+ public VersionedStatsLRURegionEntryOffHeapLongKey (RegionEntryContext context, long key,
+ @Retained
+ Object value
+ ) {
+ super(context,
+ value
+ );
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ this.key = key;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // common code
+ protected int hash;
+ private HashEntry<Object, Object> next;
+ @SuppressWarnings("unused")
+ private volatile long lastModified;
+ private static final AtomicLongFieldUpdater<VersionedStatsLRURegionEntryOffHeapLongKey> lastModifiedUpdater
+ = AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapLongKey.class, "lastModified");
+ /**
+ * All access done using ohAddrUpdater so it is used even though the compiler can not tell it is.
+ */
+ @SuppressWarnings("unused")
+ @Retained @Released private volatile long ohAddress;
+ /**
+ * I needed to add this because I wanted clear to call setValue which normally can only be called while the re is synced.
+ * But if I sync in that code it causes a lock ordering deadlock with the disk regions because they also get a rw lock in clear.
+ * Some hardware platforms do not support CAS on a long. If gemfire is run on one of those the AtomicLongFieldUpdater does a sync
+ * on the re and we will once again be deadlocked.
+ * I don't know if we support any of the hardware platforms that do not have a 64bit CAS. If we do then we can expect deadlocks
+ * on disk regions.
+ */
+ private final static AtomicLongFieldUpdater<VersionedStatsLRURegionEntryOffHeapLongKey> ohAddrUpdater = AtomicLongFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapLongKey.class, "ohAddress");
+ @Override
+ public Token getValueAsToken() {
+ return OffHeapRegionEntryHelper.getValueAsToken(this);
+ }
+ @Override
+ protected Object getValueField() {
+ return OffHeapRegionEntryHelper._getValue(this);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ @Unretained
+ protected void setValueField(@Unretained Object v) {
+ OffHeapRegionEntryHelper.setValue(this, v);
+ }
+ @Override
+ @Retained
+ public Object _getValueRetain(RegionEntryContext context, boolean decompress) {
+ return OffHeapRegionEntryHelper._getValueRetain(this, decompress, context);
+ }
+ @Override
+ public long getAddress() {
+ return ohAddrUpdater.get(this);
+ }
+ @Override
+ public boolean setAddress(long expectedAddr, long newAddr) {
+ return ohAddrUpdater.compareAndSet(this, expectedAddr, newAddr);
+ }
+ @Override
+ @Released
+ public void release() {
+ OffHeapRegionEntryHelper.releaseEntry(this);
+ }
+ @Override
+ public void returnToPool() {
+ // Deadcoded for now; never was working
+// if (this instanceof VMThinRegionEntryLongKey) {
+// factory.returnToPool((VMThinRegionEntryLongKey)this);
+// }
+ }
+ protected long getlastModifiedField() {
+ return lastModifiedUpdater.get(this);
+ }
+ protected boolean compareAndSetLastModifiedField(long expectedValue, long newValue) {
+ return lastModifiedUpdater.compareAndSet(this, expectedValue, newValue);
+ }
+ /**
+ * @see HashEntry#getEntryHash()
+ */
+ public final int getEntryHash() {
+ return this.hash;
+ }
+ protected void setEntryHash(int v) {
+ this.hash = v;
+ }
+ /**
+ * @see HashEntry#getNextEntry()
+ */
+ public final HashEntry<Object, Object> getNextEntry() {
+ return this.next;
+ }
+ /**
+ * @see HashEntry#setNextEntry
+ */
+ public final void setNextEntry(final HashEntry<Object, Object> n) {
+ this.next = n;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // lru code
+ @Override
+ public void setDelayedDiskId(LocalRegion r) {
+ // nothing needed for LRUs with no disk
+ }
+ public final synchronized int updateEntrySize(EnableLRU capacityController) {
+ return updateEntrySize(capacityController, _getValue()); // OFHEAP: _getValue ok w/o incing refcount because we are synced and only getting the size
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public final synchronized int updateEntrySize(EnableLRU capacityController,
+ Object value) {
+ int oldSize = getEntrySize();
+ int newSize = capacityController.entrySize( getKeyForSizing(), value);
+ setEntrySize(newSize);
+ int delta = newSize - oldSize;
+ // if ( debug ) log( "updateEntrySize key=" + getKey()
+ // + (_getValue() == Token.INVALID ? " invalid" :
+ // (_getValue() == Token.LOCAL_INVALID ? "local_invalid" :
+ // (_getValue()==null ? " evicted" : " valid")))
+ // + " oldSize=" + oldSize
+ // + " newSize=" + this.size );
+ return delta;
+ }
+ public final boolean testRecentlyUsed() {
+ return areAnyBitsSet(RECENTLY_USED);
+ }
+ @Override
+ public final void setRecentlyUsed() {
+ setBits(RECENTLY_USED);
+ }
+ public final void unsetRecentlyUsed() {
+ clearBits(~RECENTLY_USED);
+ }
+ public final boolean testEvicted() {
+ return areAnyBitsSet(EVICTED);
+ }
+ public final void setEvicted() {
+ setBits(EVICTED);
+ }
+ public final void unsetEvicted() {
+ clearBits(~EVICTED);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ private LRUClockNode nextLRU;
+ private LRUClockNode prevLRU;
+ private int size;
+ public final void setNextLRUNode( LRUClockNode next ) {
+ this.nextLRU = next;
+ }
+ public final LRUClockNode nextLRUNode() {
+ return this.nextLRU;
+ }
+ public final void setPrevLRUNode( LRUClockNode prev ) {
+ this.prevLRU = prev;
+ }
+ public final LRUClockNode prevLRUNode() {
+ return this.prevLRU;
+ }
+ public final int getEntrySize() {
+ return this.size;
+ }
+ protected final void setEntrySize(int size) {
+ this.size = size;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+//@Override
+//public StringBuilder appendFieldsToString(final StringBuilder sb) {
+// StringBuilder result = super.appendFieldsToString(sb);
+// result.append("; prev=").append(this.prevLRU==null?"null":"not null");
+// result.append("; next=").append(this.nextLRU==null?"null":"not null");
+// return result;
+//}
+ @Override
+ public Object getKeyForSizing() {
+ // inline keys always report null for sizing since the size comes from the entry size
+ return null;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // stats code
+ @Override
+ public final void updateStatsForGet(boolean hit, long time)
+ {
+ setLastAccessed(time);
+ if (hit) {
+ incrementHitCount();
+ } else {
+ incrementMissCount();
+ }
+ }
+ @Override
+ protected final void setLastModified(long lastModified) {
+ _setLastModified(lastModified);
+ if (!DISABLE_ACCESS_TIME_UPDATE_ON_PUT) {
+ setLastAccessed(lastModified);
+ }
+ }
+ private volatile long lastAccessed;
+ private volatile int hitCount;
+ private volatile int missCount;
+ private static final AtomicIntegerFieldUpdater<VersionedStatsLRURegionEntryOffHeapLongKey> hitCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapLongKey.class, "hitCount");
+ private static final AtomicIntegerFieldUpdater<VersionedStatsLRURegionEntryOffHeapLongKey> missCountUpdater
+ = AtomicIntegerFieldUpdater.newUpdater(VersionedStatsLRURegionEntryOffHeapLongKey.class, "missCount");
+ @Override
+ public final long getLastAccessed() throws InternalStatisticsDisabledException {
+ return this.lastAccessed;
+ }
+ private void setLastAccessed(long lastAccessed) {
+ this.lastAccessed = lastAccessed;
+ }
+ @Override
+ public final long getHitCount() throws InternalStatisticsDisabledException {
+ return this.hitCount & 0xFFFFFFFFL;
+ }
+ @Override
+ public final long getMissCount() throws InternalStatisticsDisabledException {
+ return this.missCount & 0xFFFFFFFFL;
+ }
+ private void incrementHitCount() {
+ hitCountUpdater.incrementAndGet(this);
+ }
+ private void incrementMissCount() {
+ missCountUpdater.incrementAndGet(this);
+ }
+ @Override
+ public final void resetCounts() throws InternalStatisticsDisabledException {
+ hitCountUpdater.set(this,0);
+ missCountUpdater.set(this,0);
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ @Override
+ public final void txDidDestroy(long currTime) {
+ setLastModified(currTime);
+ setLastAccessed(currTime);
+ this.hitCount = 0;
+ this.missCount = 0;
+ }
+ @Override
+ public boolean hasStats() {
+ return true;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // versioned code
+ private VersionSource memberID;
+ private short entryVersionLowBytes;
+ private short regionVersionHighBytes;
+ private int regionVersionLowBytes;
+ private byte entryVersionHighByte;
+ private byte distributedSystemId;
+ public int getEntryVersion() {
+ return ((entryVersionHighByte << 16) & 0xFF0000) | (entryVersionLowBytes & 0xFFFF);
+ }
+ public long getRegionVersion() {
+ return (((long)regionVersionHighBytes) << 32) | (regionVersionLowBytes & 0x00000000FFFFFFFFL);
+ }
+ public long getVersionTimeStamp() {
+ return getLastModified();
+ }
+ public void setVersionTimeStamp(long time) {
+ setLastModified(time);
+ }
+ public VersionSource getMemberID() {
+ return this.memberID;
+ }
+ public int getDistributedSystemId() {
+ return this.distributedSystemId;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public void setVersions(VersionTag tag) {
+ this.memberID = tag.getMemberID();
+ int eVersion = tag.getEntryVersion();
+ this.entryVersionLowBytes = (short)(eVersion & 0xffff);
+ this.entryVersionHighByte = (byte)((eVersion & 0xff0000) >> 16);
+ this.regionVersionHighBytes = tag.getRegionVersionHighBytes();
+ this.regionVersionLowBytes = tag.getRegionVersionLowBytes();
+ if (!(tag.isGatewayTag()) && this.distributedSystemId == tag.getDistributedSystemId()) {
+ if (getVersionTimeStamp() <= tag.getVersionTimeStamp()) {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ } else {
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ }
+ } else {
+ setVersionTimeStamp(tag.getVersionTimeStamp());
+ }
+ this.distributedSystemId = (byte)(tag.getDistributedSystemId() & 0xff);
+ }
+ public void setMemberID(VersionSource memberID) {
+ this.memberID = memberID;
+ }
+ @Override
+ public VersionStamp getVersionStamp() {
+ return this;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ public VersionTag asVersionTag() {
+ VersionTag tag = VersionTag.create(memberID);
+ tag.setEntryVersion(getEntryVersion());
+ tag.setRegionVersion(this.regionVersionHighBytes, this.regionVersionLowBytes);
+ tag.setVersionTimeStamp(getVersionTimeStamp());
+ tag.setDistributedSystemId(this.distributedSystemId);
+ return tag;
+ }
+ public void processVersionTag(LocalRegion r, VersionTag tag,
+ boolean isTombstoneFromGII, boolean hasDelta,
+ VersionSource thisVM, InternalDistributedMember sender, boolean checkForConflicts) {
+ basicProcessVersionTag(r, tag, isTombstoneFromGII, hasDelta, thisVM, sender, checkForConflicts);
+ }
+ @Override
+ public void processVersionTag(EntryEvent cacheEvent) {
+ // this keeps Eclipse happy. without it the sender chain becomes confused
+ // while browsing this code
+ super.processVersionTag(cacheEvent);
+ }
+ /** get rvv internal high byte. Used by region entries for transferring to storage */
+ public short getRegionVersionHighBytes() {
+ return this.regionVersionHighBytes;
+ }
+ /** get rvv internal low bytes. Used by region entries for transferring to storage */
+ public int getRegionVersionLowBytes() {
+ return this.regionVersionLowBytes;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+ // key code
+ private final long key;
+ @Override
+ public final Object getKey() {
+ return this.key;
+ }
+ @Override
+ public boolean isKeyEqual(Object k) {
+ if (k instanceof Long) {
+ return ((Long) k).longValue() == this.key;
+ }
+ return false;
+ }
+ // DO NOT modify this class. It was generated from LeafRegionEntry.cpp
+}