Skip to content

Commit

Permalink
Prevented unneeded key&value deserialization of server side event pub…
Browse files Browse the repository at this point in the history
…lishing
  • Loading branch information
ahmetmircik committed Dec 5, 2018
1 parent 5bc9971 commit ce7871d
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 13 deletions.
Expand Up @@ -17,11 +17,18 @@
package com.hazelcast.client.replicatedmap;

import com.hazelcast.client.test.TestHazelcastFactory;
import com.hazelcast.config.Config;
import com.hazelcast.config.InMemoryFormat;
import com.hazelcast.core.EntryAdapter;
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.MapEvent;
import com.hazelcast.core.ReplicatedMap;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.nio.serialization.DataSerializable;
import com.hazelcast.query.TruePredicate;
import com.hazelcast.query.impl.FalsePredicate;
import com.hazelcast.test.AssertTask;
import com.hazelcast.test.HazelcastParallelClassRunner;
Expand All @@ -32,7 +39,10 @@
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import static org.junit.Assert.assertEquals;
Expand Down Expand Up @@ -139,7 +149,52 @@ public void run() {
});
}

private ReplicatedMap<Object, Object> createClusterAndGetRandomReplicatedMap() {
@Test
public void no_key_value_deserialization_on_server_when_in_memory_format_is_binary() {
final CountDownLatch eventReceivedLatch = new CountDownLatch(1);

Config config = new Config();
config.getReplicatedMapConfig("default").setInMemoryFormat(InMemoryFormat.BINARY);

HazelcastInstance server = factory.newHazelcastInstance(config);
HazelcastInstance client = factory.newHazelcastClient();

ReplicatedMap<DeserializationCounter, DeserializationCounter> replicatedMap = client.getReplicatedMap("test");
replicatedMap.addEntryListener(new EntryAdapter<DeserializationCounter, DeserializationCounter>() {
@Override
public void onEntryEvent(EntryEvent<DeserializationCounter, DeserializationCounter> event) {
eventReceivedLatch.countDown();
}
}, TruePredicate.INSTANCE);

DeserializationCounter key = new DeserializationCounter();
DeserializationCounter value = new DeserializationCounter();

replicatedMap.put(key, value);

// wait to get event on client side
assertOpenEventually(eventReceivedLatch);

assertEquals(0, key.DESERIALIZATION_COUNT.get());
assertEquals(0, value.DESERIALIZATION_COUNT.get());
}

public static class DeserializationCounter implements DataSerializable {

protected final static AtomicInteger DESERIALIZATION_COUNT = new AtomicInteger();

@Override
public void writeData(ObjectDataOutput out) throws IOException {

}

@Override
public void readData(ObjectDataInput in) throws IOException {
DESERIALIZATION_COUNT.incrementAndGet();
}
}

private <K, V> ReplicatedMap<K, V> createClusterAndGetRandomReplicatedMap() {
factory.newHazelcastInstance();
HazelcastInstance client = factory.newHazelcastClient();
String mapName = randomMapName();
Expand Down
Expand Up @@ -24,6 +24,7 @@
import com.hazelcast.core.MapEvent;
import com.hazelcast.core.Member;
import com.hazelcast.instance.Node;
import com.hazelcast.map.impl.DataAwareEntryEvent;
import com.hazelcast.nio.Connection;
import com.hazelcast.nio.serialization.Data;
import com.hazelcast.query.Predicate;
Expand Down Expand Up @@ -88,26 +89,28 @@ private void handleEvent(EntryEvent<Object, Object> event) {
return;
}

Data key = serializationService.toData(event.getKey());
Data newValue = serializationService.toData(event.getValue());
Data oldValue = serializationService.toData(event.getOldValue());
Data mergingValue = serializationService.toData(event.getMergingValue());
DataAwareEntryEvent dataAwareEntryEvent = (DataAwareEntryEvent) event;

ClientMessage clientMessage = encodeEvent(key
, newValue, oldValue, mergingValue, event.getEventType().getType(),
event.getMember().getUuid(), 1);
sendClientMessage(key, clientMessage);
Data key = dataAwareEntryEvent.getKeyData();
Data newValue = dataAwareEntryEvent.getNewValueData();
Data oldValue = dataAwareEntryEvent.getOldValueData();
Data mergingValue = dataAwareEntryEvent.getMergingValueData();

ClientMessage clientMessage = encodeEvent(key
, newValue, oldValue, mergingValue, event.getEventType().getType(),
event.getMember().getUuid(), 1);
sendClientMessage(key, clientMessage);
}

private void handleMapEvent(MapEvent event) {
if (!shouldSendEvent(event)) {
return;
}

ClientMessage clientMessage = encodeEvent(null
, null, null, null, event.getEventType().getType(),
event.getMember().getUuid(), event.getNumberOfEntriesAffected());
sendClientMessage(null, clientMessage);
ClientMessage clientMessage = encodeEvent(null
, null, null, null, event.getEventType().getType(),
event.getMember().getUuid(), event.getNumberOfEntriesAffected());
sendClientMessage(null, clientMessage);
}

private boolean shouldSendEvent(IMapEvent event) {
Expand Down

0 comments on commit ce7871d

Please sign in to comment.