You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Donal Evans (Jira)" <ji...@apache.org> on 2021/06/03 20:14:00 UTC

[jira] [Created] (GEODE-9345) Refactor RedisSet set operations to not do so much set copying

Donal Evans created GEODE-9345:
----------------------------------

             Summary: Refactor RedisSet set operations to not do so much set copying
                 Key: GEODE-9345
                 URL: https://issues.apache.org/jira/browse/GEODE-9345
             Project: Geode
          Issue Type: Improvement
          Components: redis
    Affects Versions: 1.15.0
            Reporter: Donal Evans


The implementation of the (unsupported at time of ticket creation) sunion, sunionstore, sdiff, sdiffstore, sinter and sinterstore commands includes potentially expensive set copying as part of the calls to {{smembers()}} and {{internalsmembers()}}:

 
{code:java}
@Override
public Set<byte[]> smembers(RedisKey key) {
  return stripedExecute(key, () -> new HashSet<>(getRedisSet(key, true).smembers()));
}

@Override
public Set<byte[]> internalsmembers(RedisKey key) {
  return stripedExecute(key, () -> new HashSet<>(getRedisSet(key, false).smembers()));
}{code}
and in {{computeSetOp()}}:

 
{code:java}
if (result == null) {
  result = new ObjectOpenCustomHashSet<>(set, ByteArrays.HASH_STRATEGY);
} else {
  switch (setOp) {
    case UNION:
      result.addAll(set);
      break;
    case INTERSECTION:
      set = new ObjectOpenCustomHashSet<>(set, ByteArrays.HASH_STRATEGY);
      result.retainAll(set);
      break;
    case DIFF:
      set = new ObjectOpenCustomHashSet<>(set, ByteArrays.HASH_STRATEGY);
      result.removeAll(set);
      break;
  }
}{code}
 

due to the need to use a custom hash set implementation to properly handle equality comparisons between byte arrays, but the current implementation used, ObjectOpenCustomHashSet, causes serialization errors when returned from {{smembers()}} and {{internalsmembers()}}.

To avoid unnecessary set copying, a way should be found to allow an {{ObjectOpenCustomHashSet}} to be returned from {{smembers()}} and {{internalsmembers()}} without causing serialization errors.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)