Skip to content

Commit

Permalink
StorageNodeFactory refactoring, DevicesService edit, update device st…
Browse files Browse the repository at this point in the history
…ate with lock
  • Loading branch information
creepid committed Mar 27, 2018
1 parent 131243c commit 5988710
Show file tree
Hide file tree
Showing 12 changed files with 284 additions and 121 deletions.
1 change: 0 additions & 1 deletion esh-client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.12</version>
</dependency>
<dependency>
<groupId>net.easysmarthouse</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public class ClientConfiguration {
@Bean(name = "HazelcastClientConfig")
public ClientConfig clientConfig() {
ClientConfig clientConfig = new ClientConfig();
//unlimited connections (try to reconnect)
clientConfig.getNetworkConfig().setConnectionAttemptLimit(0);
return clientConfig;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import com.hazelcast.query.SqlPredicate;
import net.easysmarthouse.distribution.shared.Device;
import net.easysmarthouse.distribution.shared.MapNames;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -12,6 +13,8 @@
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

@Service
public class DeviceService implements MapNames {
Expand All @@ -28,6 +31,11 @@ public DeviceService(@Qualifier("ClientInstance")
@PostConstruct
public void init() {
devicesMap = hazelcastInstance.getMap(DEVICES_MAP);
devicesMap.addIndex("label", true);
}

public Device getDevice(Long key) {
return devicesMap.get(key);
}

public void addDevice(Device device) {
Expand All @@ -42,10 +50,53 @@ public void addDevices(Collection<Device> devices) {
devicesMap.putAll(devicesLocalMap);
}

public Collection<Device> findDeviceByAddress(String address) {
SqlPredicate addressPredicate = new SqlPredicate("address = '" + address + "'");
return devicesMap.values(addressPredicate);
}

public void updateDevice(Device device) {
devicesMap.put(device.getId(), device);
}

public boolean updateDeviceWithLock(Long deviceId, Function<Device, Device> function) {
try {
boolean lockObtained = devicesMap.tryLock(deviceId, 2, TimeUnit.SECONDS);
try {
if (!lockObtained) {
return false;
}
Device oldDevice = getDevice(deviceId);
Device newDevice = function.apply(oldDevice);
devicesMap.put(deviceId, newDevice);
} finally {
devicesMap.unlock(deviceId);
}
return true;
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}

public boolean updateDeviceStateWithLock(Long deviceId, String deviceState) {
try {
boolean lockObtained = devicesMap.tryLock(deviceId, 2, TimeUnit.SECONDS);
try {
if (!lockObtained) {
return false;
}
Device device = getDevice(deviceId);
device.setState(deviceState);
devicesMap.put(deviceId, device);
} finally {
devicesMap.unlock(deviceId);
}
return true;
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}

public void deleteDevice(Device device) {
devicesMap.delete(device.getId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import net.easysmarthouse.distribution.client.helper.StorageNodeFactory;
import net.easysmarthouse.distribution.storage.node.factory.StorageNodeFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
Expand All @@ -12,7 +12,7 @@
@ComponentScan(basePackages = {
"net.easysmarthouse.distribution.shared",
"net.easysmarthouse.distribution.client",
"net.easysmarthouse.distribution.storage",
"net.easysmarthouse.distribution.storage"
})
public class HazelcastClientTestConfiguration {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package net.easysmarthouse.distribution.client.helper;

import net.easysmarthouse.distribution.shared.Device;
import net.easysmarthouse.distribution.shared.DeviceType;

import java.util.ArrayList;
import java.util.List;

public class DeviceGenerator {

public List<Device> generate(int maxDevices) throws Exception {
List<Device> devices = new ArrayList<>(maxDevices);

for (long x = 0; x < maxDevices; x++) {
devices.add(
new Device(x,
"Device " + x,
"DF456345633545555" + x,
DeviceType.Sensor,
"Sensor " + x
)
);
}

return devices;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package net.easysmarthouse.distribution.client.service.devices;

import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import net.easysmarthouse.distribution.client.HazelcastClientTestConfiguration;
import net.easysmarthouse.distribution.client.helper.DeviceGenerator;
import net.easysmarthouse.distribution.shared.Device;
import net.easysmarthouse.distribution.shared.DeviceType;
import net.easysmarthouse.distribution.storage.node.factory.StorageNodeFactory;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {HazelcastClientTestConfiguration.class})
public class DeviceServiceIntegrationTest {

@Autowired
private DeviceService deviceService;

@Autowired
@Qualifier("ClientInstance")
private HazelcastInstance hazelcastInstance;

@Autowired
private StorageNodeFactory storageNodeFactory;

@Before
public void setUp() throws Exception {
hazelcastInstance.getMap(DeviceService.DEVICES_MAP).clear();
}

//@Test
public void testAddDevice() {
System.out.println("***** addDevice *****");
Device device = new Device(2134l, "Simple switch", "DF4534563456FF", DeviceType.Switch, "Device description");
deviceService.addDevice(device);

IMap<Long, Device> devicesMap = hazelcastInstance.getMap(DeviceService.DEVICES_MAP);
assertEquals(1, devicesMap.size());
assertEquals(device, devicesMap.get(2134l));
}

//@Test
public void testAddDevices() {
System.out.println("***** addDevices *****");
Device device1 = new Device(2134l, "Simple switch 1", "DF4534563456FF", DeviceType.Switch, "Device description 1");
Device device2 = new Device(2135l, "Simple switch 2", "DF4534563457FF", DeviceType.Switch, "Device description 2");
Device device3 = new Device(2136l, "Simple switch 3", "DF4534563458FF", DeviceType.Switch, "Device description 3");

List<Device> devices = Arrays.asList(device1, device2, device3);

deviceService.addDevices(devices);

IMap<Long, Device> deviceMap = hazelcastInstance.getMap(DeviceService.DEVICES_MAP);
assertEquals(3, deviceMap.size());
assertEquals(device1, deviceMap.get(2134l));
assertEquals(device2, deviceMap.get(2135l));
assertEquals(device3, deviceMap.get(2136l));
}

//@Test
public void testNoDataLossWithOnlyOneNode() throws Exception {
System.out.println("***** noDataLossWithOnlyOneNode *****");
storageNodeFactory.ensureClusterSize(4);

int maxDevices = 1000;
List<Device> devices = new DeviceGenerator().generate(maxDevices);
deviceService.addDevices(devices);

Map<Long, Device> deviceMap = hazelcastInstance.getMap(DeviceService.DEVICES_MAP);
assertEquals(maxDevices, deviceMap.size());

storageNodeFactory.ensureClusterSize(1);
assertEquals(maxDevices, deviceMap.size());
}


//@Test
public void testNoDataLossAfterClusterShutdown() throws Exception {
System.out.println("***** noDataLossAfterClusterShutdown *****");
storageNodeFactory.ensureClusterSize(4);

int maxDevices = 1000;
List<Device> devices = new DeviceGenerator().generate(maxDevices);
deviceService.addDevices(devices);

Map<Long, Device> deviceMap = hazelcastInstance.getMap(DeviceService.DEVICES_MAP);
assertEquals(maxDevices, deviceMap.size());

storageNodeFactory.ensureClusterSize(0);
storageNodeFactory.ensureClusterSize(3);

assertEquals(maxDevices, deviceMap.size());
}

//@Test
public void testFindDevicesByAddress() throws Exception {
System.out.println("***** findDevicesByAddress *****");
deviceService.addDevices(new DeviceGenerator().generate(1000));

Collection<Device> devices = deviceService.findDeviceByAddress("DF4563456335455555");
assertEquals(1, devices.size());
assertEquals("Device 5", devices.iterator().next().getLabel());
}

@Test
public void testUpdateDeviceState() throws Exception {
System.out.println("***** updateDeviceState *****");
deviceService.addDevices(new DeviceGenerator().generate(2));

assertEquals("Device 1", deviceService.getDevice(1l).getLabel());

boolean result = deviceService.updateDeviceStateWithLock(1l, "1323.34");
assertTrue(result);

assertEquals("1323.34", deviceService.getDevice(1l).getState());
}

}

This file was deleted.

Loading

0 comments on commit 5988710

Please sign in to comment.