Skip to content

Commit

Permalink
make ui more responsive - acquire lock with timeout when getting status
Browse files Browse the repository at this point in the history
  • Loading branch information
dernasherbrezon committed Mar 6, 2024
1 parent 81de0e2 commit 5ba8e54
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 22 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@
<arch>all</arch>
<section>embedded</section>
<osDependencies>
<r2cloud-ui>>=1513613469</r2cloud-ui>
<r2cloud-ui>>=20240303125106</r2cloud-ui>
<r2cloud-jdk>>=17.0.5-1</r2cloud-jdk>
<nginx-light>>=1.10.3</nginx-light>
<rtl-sdr>>=0.6.4</rtl-sdr>
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/ru/r2cloud/device/RtlSdrDevice.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ru.r2cloud.device;

import java.util.concurrent.locks.ReentrantLock;

import ru.r2cloud.model.DeviceConfiguration;
import ru.r2cloud.model.DeviceStatus;
import ru.r2cloud.model.Framing;
Expand All @@ -26,7 +28,7 @@ public class RtlSdrDevice extends Device {
private final Configuration config;
private final ProcessFactory processFactory;
private final RtlStatusProcess statusDao;
private final Object lock = new Object();
private final ReentrantLock lock = new ReentrantLock();

public RtlSdrDevice(String id, TransmitterFilter filter, int numberOfConcurrentObservations, ObservationFactory observationFactory, ThreadPoolFactory threadpoolFactory, Clock clock, DeviceConfiguration deviceConfiguration, IObservationDao observationDao, DecoderService decoderService,
PredictOreKit predict, Schedule schedule, Configuration config, ProcessFactory processFactory) {
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/ru/r2cloud/satellite/reader/RtlFmReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -27,9 +28,9 @@ public class RtlFmReader implements IQReader {
private final ObservationRequest req;
private final Configuration config;
private final ProcessFactory factory;
private final Object lock;
private final ReentrantLock lock;

public RtlFmReader(Configuration config, DeviceConfiguration deviceConfiguration, ProcessFactory factory, ObservationRequest req, Object lock) {
public RtlFmReader(Configuration config, DeviceConfiguration deviceConfiguration, ProcessFactory factory, ObservationRequest req, ReentrantLock lock) {
this.config = config;
this.deviceConfiguration = deviceConfiguration;
this.factory = factory;
Expand All @@ -39,8 +40,11 @@ public RtlFmReader(Configuration config, DeviceConfiguration deviceConfiguration

@Override
public IQData start() throws InterruptedException {
synchronized (lock) {
lock.lock();
try {
return startInternally();
} finally {
lock.unlock();
}
}

Expand Down
10 changes: 7 additions & 3 deletions src/main/java/ru/r2cloud/satellite/reader/RtlSdrReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -32,9 +33,9 @@ public class RtlSdrReader implements IQReader {
private final ProcessFactory factory;
private final ObservationRequest req;
private final Transmitter transmitter;
private final Object lock;
private final ReentrantLock lock;

public RtlSdrReader(Configuration config, DeviceConfiguration deviceConfiguration, ProcessFactory factory, ObservationRequest req, Transmitter transmitter, Object lock) {
public RtlSdrReader(Configuration config, DeviceConfiguration deviceConfiguration, ProcessFactory factory, ObservationRequest req, Transmitter transmitter, ReentrantLock lock) {
this.config = config;
this.deviceConfiguration = deviceConfiguration;
this.factory = factory;
Expand Down Expand Up @@ -64,8 +65,11 @@ public RtlSdrReader(Configuration config, DeviceConfiguration deviceConfiguratio

@Override
public IQData start() throws InterruptedException {
synchronized (lock) {
lock.lock();
try {
return startInternally();
} finally {
lock.unlock();
}
}

Expand Down
28 changes: 21 additions & 7 deletions src/main/java/ru/r2cloud/sdr/RtlStatusProcess.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Expand All @@ -24,27 +26,39 @@ public class RtlStatusProcess implements SdrStatusProcess {
private final Configuration config;
private final ProcessFactory factory;
private final int expectedRtlDeviceId;
private final Object lock;
private final ReentrantLock lock;
private SdrStatus previousStatus;

public RtlStatusProcess(Configuration config, ProcessFactory factory, int expectedRtlDeviceId, Object lock) {
public RtlStatusProcess(Configuration config, ProcessFactory factory, int expectedRtlDeviceId, ReentrantLock lock) {
this.config = config;
this.factory = factory;
this.expectedRtlDeviceId = expectedRtlDeviceId;
this.lock = lock;
this.previousStatus = getStatus();
}

@Override
public SdrStatus getStatus() {
SdrStatus result = null;
// won't help much for systems with multiple rtlsdr sticks
// rtl_test will lock each device despite "-d" argument
synchronized (lock) {
result = getStatusInternally(result);
try {
if (lock.tryLock(1000, TimeUnit.MILLISECONDS)) {
try {
previousStatus = getStatusInternally();
return previousStatus;
} finally {
lock.unlock();
}
}
LOG.info("can't get status within specified timeout. returning previous status");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return result;
return previousStatus;
}

private SdrStatus getStatusInternally(SdrStatus result) {
private SdrStatus getStatusInternally() {
SdrStatus result = null;
try {
BufferedReader r = null;
ProcessWrapper process = factory.create(config.getProperty("satellites.rtlsdr.test.path") + " -t", false, false);
Expand Down
3 changes: 2 additions & 1 deletion src/test/java/ru/r2cloud/RtlStatusProcessTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import java.io.File;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;

import org.junit.After;
import org.junit.Before;
Expand Down Expand Up @@ -66,7 +67,7 @@ public void start() throws Exception {
rtlTestServer = new RtlTestServer(8003);
rtlTestServer.start();

dao = new RtlStatusProcess(config, new ProcessFactory(), expectedRtlDeviceId, new Object());
dao = new RtlStatusProcess(config, new ProcessFactory(), expectedRtlDeviceId, new ReentrantLock());
}

@After
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;

import org.junit.Before;
import org.junit.Rule;
Expand Down Expand Up @@ -52,7 +53,7 @@ public void testFailure() throws Exception {
ObservationRequest req = new ObservationRequest();
req.setSatelliteId(satelliteId);

RtlFmReader o = new RtlFmReader(config, new DeviceConfiguration(), factory, req, new Object());
RtlFmReader o = new RtlFmReader(config, new DeviceConfiguration(), factory, req, new ReentrantLock());
IQData iqData = o.start();
o.complete();
assertNull(iqData.getDataFile());
Expand All @@ -70,7 +71,7 @@ public void testSuccess() throws Exception {

ObservationRequest req = new ObservationRequest();

RtlFmReader o = new RtlFmReader(config, new DeviceConfiguration(), factory, req, new Object());
RtlFmReader o = new RtlFmReader(config, new DeviceConfiguration(), factory, req, new ReentrantLock());
o.start();
o.complete();
assertEquals(data, new String(baos.toByteArray(), StandardCharsets.UTF_8));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;

import org.junit.Before;
import org.junit.Rule;
Expand Down Expand Up @@ -44,7 +45,7 @@ public void testBiasTSuccess() throws Exception {
Transmitter transmitter = new Transmitter();
transmitter.setBaudRates(Collections.singletonList(9600));

RtlSdrReader o = new RtlSdrReader(config, deviceConfiguration, factory, req, transmitter, new Object());
RtlSdrReader o = new RtlSdrReader(config, deviceConfiguration, factory, req, transmitter, new ReentrantLock());
IQData iqData = o.start();
o.complete();
assertNotNull(iqData.getDataFile());
Expand All @@ -64,7 +65,7 @@ public void testBiasTFailure() throws Exception {
Transmitter transmitter = new Transmitter();
transmitter.setBaudRates(Collections.singletonList(9600));

RtlSdrReader o = new RtlSdrReader(config, deviceConfiguration, factory, req, transmitter, new Object());
RtlSdrReader o = new RtlSdrReader(config, deviceConfiguration, factory, req, transmitter, new ReentrantLock());
IQData iqData = o.start();
o.complete();
assertNull(iqData);
Expand All @@ -81,7 +82,7 @@ public void testFailure() throws Exception {
Transmitter transmitter = new Transmitter();
transmitter.setBaudRates(Collections.singletonList(9600));

RtlSdrReader o = new RtlSdrReader(config, new DeviceConfiguration(), factory, req, transmitter, new Object());
RtlSdrReader o = new RtlSdrReader(config, new DeviceConfiguration(), factory, req, transmitter, new ReentrantLock());
IQData iqData = o.start();
o.complete();
assertNull(iqData.getDataFile());
Expand All @@ -98,7 +99,7 @@ public void testSuccess() throws Exception {
Transmitter transmitter = new Transmitter();
transmitter.setBaudRates(Collections.singletonList(9600));

RtlSdrReader o = new RtlSdrReader(config, new DeviceConfiguration(), factory, req, transmitter, new Object());
RtlSdrReader o = new RtlSdrReader(config, new DeviceConfiguration(), factory, req, transmitter, new ReentrantLock());
IQData iqData = o.start();
o.complete();
assertNotNull(iqData.getDataFile());
Expand Down

0 comments on commit 5ba8e54

Please sign in to comment.