Return-Path: X-Original-To: apmail-geode-commits-archive@minotaur.apache.org Delivered-To: apmail-geode-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D16771836B for ; Thu, 9 Jul 2015 17:03:49 +0000 (UTC) Received: (qmail 57461 invoked by uid 500); 9 Jul 2015 17:03:49 -0000 Delivered-To: apmail-geode-commits-archive@geode.apache.org Received: (qmail 57431 invoked by uid 500); 9 Jul 2015 17:03:49 -0000 Mailing-List: contact commits-help@geode.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.incubator.apache.org Delivered-To: mailing list commits@geode.incubator.apache.org Received: (qmail 57422 invoked by uid 99); 9 Jul 2015 17:03:49 -0000 Received: from Unknown (HELO spamd2-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 09 Jul 2015 17:03:49 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd2-us-west.apache.org (ASF Mail Server at spamd2-us-west.apache.org) with ESMTP id 2F9EB1A6C7B for ; Thu, 9 Jul 2015 17:03:49 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd2-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.791 X-Spam-Level: * X-Spam-Status: No, score=1.791 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001] autolearn=disabled Received: from mx1-eu-west.apache.org ([10.40.0.8]) by localhost (spamd2-us-west.apache.org [10.40.0.9]) (amavisd-new, port 10024) with ESMTP id qCDskEb44cid for ; Thu, 9 Jul 2015 17:03:37 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-eu-west.apache.org (ASF Mail Server at mx1-eu-west.apache.org) with SMTP id DBC4E2054C for ; Thu, 9 Jul 2015 17:03:35 +0000 (UTC) Received: (qmail 53939 invoked by uid 99); 9 Jul 2015 17:02:20 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 09 Jul 2015 17:02:20 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 00BA3E6836; Thu, 9 Jul 2015 17:02:19 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: dschneider@apache.org To: commits@geode.incubator.apache.org Date: Thu, 09 Jul 2015 17:02:19 -0000 Message-Id: <7f249334f8de4a87a653a7c04a138bba@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [01/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 Repository: incubator-geode Updated Branches: refs/heads/develop 121978388 -> b205339a0 http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/31d1b20e/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedThinDiskLRURegionEntryOffHeapStringKey2.java ---------------------------------------------------------------------- diff --git a/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedThinDiskLRURegionEntryOffHeapStringKey2.java b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedThinDiskLRURegionEntryOffHeapStringKey2.java new file mode 100644 index 0000000..423df99 --- /dev/null +++ b/gemfire-core/src/main/java/com/gemstone/gemfire/internal/cache/VersionedThinDiskLRURegionEntryOffHeapStringKey2.java @@ -0,0 +1,508 @@ +/*========================================================================= + * 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.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 VersionedThinDiskLRURegionEntryOffHeapStringKey2 extends VersionedThinDiskLRURegionEntryOffHeap { + public VersionedThinDiskLRURegionEntryOffHeapStringKey2 (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 next; + @SuppressWarnings("unused") + private volatile long lastModified; + private static final AtomicLongFieldUpdater lastModifiedUpdater + = AtomicLongFieldUpdater.newUpdater(VersionedThinDiskLRURegionEntryOffHeapStringKey2.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 ohAddrUpdater = AtomicLongFieldUpdater.newUpdater(VersionedThinDiskLRURegionEntryOffHeapStringKey2.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 getNextEntry() { + return this.next; + } + /** + * @see HashEntry#setNextEntry + */ + public final void setNextEntry(final HashEntry n) { + this.next = n; + } + // DO NOT modify this class. It was generated from LeafRegionEntry.cpp + // disk code + protected void initialize(RegionEntryContext drs, Object value) { + boolean isBackup; + if (drs instanceof LocalRegion) { + isBackup = ((LocalRegion)drs).getDiskRegion().isBackup(); + } else if (drs instanceof PlaceHolderDiskRegion) { + isBackup = true; + } else { + throw new IllegalArgumentException("expected a LocalRegion or PlaceHolderDiskRegion"); + } + // Delay the initialization of DiskID if overflow only + if (isBackup) { + diskInitialize(drs, value); + } + } + @Override + public final synchronized int updateAsyncEntrySize(EnableLRU capacityController) { + int oldSize = getEntrySize(); + int newSize = capacityController.entrySize( getKeyForSizing(), null); + setEntrySize(newSize); + int delta = newSize - oldSize; + return delta; + } + // 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 + // lru code + @Override + public void setDelayedDiskId(LocalRegion r) { + DiskStoreImpl ds = r.getDiskStore(); + long maxOplogSize = ds.getMaxOplogSize(); + this.id = DiskId.createDiskId(maxOplogSize, false /* over flow only */, ds.needsLinkedList()); + } + 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 + // 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 +}