[infinispan-issues] [JBoss JIRA] (ISPN-3405) Entries are passivated with wrong ID in DB

Vitalii Chepeliuk (JIRA) jira-events at lists.jboss.org
Mon Aug 12 08:09:27 EDT 2013


     [ https://issues.jboss.org/browse/ISPN-3405?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Vitalii Chepeliuk updated ISPN-3405:
------------------------------------

    Description: 
Entry passivation into DB, concretly this class LockSupportCacheStore and method store
{code:title=Bar.java|borderStyle=solid}
  @Override
   public final void store(InternalCacheEntry ed) throws CacheLoaderException {
      if (trace) {
         log.tracef("store(%s)", ed);
      }
      if (ed == null) {
        return;
      }
      if (ed.canExpire() && ed.isExpired(timeService.wallClockTime())) {
         if (containsKey(ed.getKey())) {
            if (trace) {
               log.tracef("Entry %s is expired!  Removing!", ed);
            }
            remove(ed.getKey());
         } else {
            if (trace) {
               log.tracef("Entry %s is expired!  Not doing anything.", ed);
            }
         }
         return;
      }

      L keyHashCode = getLockFromKey(ed.getKey()); <<< here key is generated like ed.getKey().hashCode() & 0xfffffc00;
      lockForWriting(keyHashCode);
      try {
         storeLockSafe(ed, keyHashCode); <<< here it should be stored into Bucket and then stored in DB
      } finally {
         unlock(keyHashCode);
      }
      if (trace) {
         log.tracef("exit store(%s)", ed);
      }
   }
{code}
When I use RemoteCacheManager and RemoteCache I am putting entries into cache
{code:title=Bar.java|borderStyle=solid}
   cache.put("key1", "v1");
   cache.put("key2", "v2");
   cache.put("key3", "v3");
{code}
Then 2 entries are passivated and stored in DB
ID                                     DATA                                                                        VERSION
183713792        0301fe032a01034c422b21033e286d7942657374506572736f6e616c4b657957686963684861734e657665724265656e426574746572420521033e02763203620003630000000000000002        -1
23486464        0301fe032a01034c420721033e046b657931420521033e02763103620003630000000000000001                                                                                -1
IDs are generated from method above and
{code:title=Bar.java|borderStyle=solid}
byte[] keyBytes = marshaller.objectToByteBuffer(key, 64); <<< data are marshalled
long keyID = ByteArrayEquivalence.INSTANCE.hashCode(keyBytes) & 0xfffffc00 //computation taken from BucketBasedCacheStore << this does not work for me
{code}
And next step I'd like to retrieve data from DB
SELECT ID, DATA FROM JDBC_BINARY_DEFAULT WHERE ID=keyID
But in method
{code:title=Bar.java|borderStyle=solid}
   @Override
   public Integer getLockFromKey(Object key) {
       return key.hashCode() & 0xfffffc00; <<< here should be used Arrays.hashCode((byte[])key)  & 0xfffffc00), if key is represented as byte array, or Used ByteArrayEquivalence instead of simple byte array(byte[]) as argument
   }
{code}

  was:
Entry passivation into DB, concretly this class LockSupportCacheStore and method store
  @Override
   public final void store(InternalCacheEntry ed) throws CacheLoaderException {
      if (trace) {
         log.tracef("store(%s)", ed);
      }
      if (ed == null) {
        return;
      }
      if (ed.canExpire() && ed.isExpired(timeService.wallClockTime())) {
         if (containsKey(ed.getKey())) {
            if (trace) {
               log.tracef("Entry %s is expired!  Removing!", ed);
            }
            remove(ed.getKey());
         } else {
            if (trace) {
               log.tracef("Entry %s is expired!  Not doing anything.", ed);
            }
         }
         return;
      }

      L keyHashCode = getLockFromKey(ed.getKey()); <<< here key is generated like ed.getKey().hashCode() & 0xfffffc00;
      lockForWriting(keyHashCode);
      try {
         storeLockSafe(ed, keyHashCode); <<< here it should be stored into Bucket and then stored in DB
      } finally {
         unlock(keyHashCode);
      }
      if (trace) {
         log.tracef("exit store(%s)", ed);
      }
   }

When I use RemoteCacheManager and RemoteCache I am putting entries into cache
   cache.put("key1", "v1");
   cache.put("key2", "v2");
   cache.put("key3", "v3");
Then 2 entries are passivated and stored in DB
ID                                     DATA                                                                        VERSION
183713792        0301fe032a01034c422b21033e286d7942657374506572736f6e616c4b657957686963684861734e657665724265656e426574746572420521033e02763203620003630000000000000002        -1
23486464        0301fe032a01034c420721033e046b657931420521033e02763103620003630000000000000001                                                                                -1
IDs are generated from method above and
byte[] keyBytes = marshaller.objectToByteBuffer(key, 64); <<< data are marshalled
long keyID = ByteArrayEquivalence.INSTANCE.hashCode(keyBytes) & 0xfffffc00 //computation taken from BucketBasedCacheStore << this does not work for me
And next step I'd like to retrieve data from DB
SELECT ID, DATA FROM JDBC_BINARY_DEFAULT WHERE ID=keyID
But in method
   @Override
   public Integer getLockFromKey(Object key) {
       return key.hashCode() & 0xfffffc00; <<< here should be used Arrays.hashCode((byte[])key)  & 0xfffffc00), if key is represented as byte array, or Used ByteArrayEquivalence instead of simple byte array(byte[]) as argument
   }


    
> Entries are passivated with wrong ID in DB
> ------------------------------------------
>
>                 Key: ISPN-3405
>                 URL: https://issues.jboss.org/browse/ISPN-3405
>             Project: Infinispan
>          Issue Type: Bug
>          Components: Eviction
>    Affects Versions: 6.0.0.Alpha1
>            Reporter: Vitalii Chepeliuk
>            Assignee: Mircea Markus
>
> Entry passivation into DB, concretly this class LockSupportCacheStore and method store
> {code:title=Bar.java|borderStyle=solid}
>   @Override
>    public final void store(InternalCacheEntry ed) throws CacheLoaderException {
>       if (trace) {
>          log.tracef("store(%s)", ed);
>       }
>       if (ed == null) {
>         return;
>       }
>       if (ed.canExpire() && ed.isExpired(timeService.wallClockTime())) {
>          if (containsKey(ed.getKey())) {
>             if (trace) {
>                log.tracef("Entry %s is expired!  Removing!", ed);
>             }
>             remove(ed.getKey());
>          } else {
>             if (trace) {
>                log.tracef("Entry %s is expired!  Not doing anything.", ed);
>             }
>          }
>          return;
>       }
>       L keyHashCode = getLockFromKey(ed.getKey()); <<< here key is generated like ed.getKey().hashCode() & 0xfffffc00;
>       lockForWriting(keyHashCode);
>       try {
>          storeLockSafe(ed, keyHashCode); <<< here it should be stored into Bucket and then stored in DB
>       } finally {
>          unlock(keyHashCode);
>       }
>       if (trace) {
>          log.tracef("exit store(%s)", ed);
>       }
>    }
> {code}
> When I use RemoteCacheManager and RemoteCache I am putting entries into cache
> {code:title=Bar.java|borderStyle=solid}
>    cache.put("key1", "v1");
>    cache.put("key2", "v2");
>    cache.put("key3", "v3");
> {code}
> Then 2 entries are passivated and stored in DB
> ID                                     DATA                                                                        VERSION
> 183713792        0301fe032a01034c422b21033e286d7942657374506572736f6e616c4b657957686963684861734e657665724265656e426574746572420521033e02763203620003630000000000000002        -1
> 23486464        0301fe032a01034c420721033e046b657931420521033e02763103620003630000000000000001                                                                                -1
> IDs are generated from method above and
> {code:title=Bar.java|borderStyle=solid}
> byte[] keyBytes = marshaller.objectToByteBuffer(key, 64); <<< data are marshalled
> long keyID = ByteArrayEquivalence.INSTANCE.hashCode(keyBytes) & 0xfffffc00 //computation taken from BucketBasedCacheStore << this does not work for me
> {code}
> And next step I'd like to retrieve data from DB
> SELECT ID, DATA FROM JDBC_BINARY_DEFAULT WHERE ID=keyID
> But in method
> {code:title=Bar.java|borderStyle=solid}
>    @Override
>    public Integer getLockFromKey(Object key) {
>        return key.hashCode() & 0xfffffc00; <<< here should be used Arrays.hashCode((byte[])key)  & 0xfffffc00), if key is represented as byte array, or Used ByteArrayEquivalence instead of simple byte array(byte[]) as argument
>    }
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the infinispan-issues mailing list