Skip to content

Commit

Permalink
improved duplicate channel search response detection
Browse files Browse the repository at this point in the history
closes #3
  • Loading branch information
msekoranja committed Jun 16, 2016
1 parent 717da70 commit ba482f5
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 34 deletions.
41 changes: 41 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry combineaccessrules="false" kind="src" path="/pvDataJava"/>
<classpathentry including="**/*.java" kind="src" output="target/test-classes" path="test"/>
<classpathentry including="**/*.java" kind="src" path="src"/>
<classpathentry kind="var" path="M2_REPO/javax/xml/bind/jaxb-api/2.0/jaxb-api-2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/xml/bind/jsr173_api/1.0/jsr173_api-1.0.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4/mail-1.4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="var" path="M2_REPO/junit/junit/4.12/junit-4.12.jar"/>
<classpathentry kind="var" path="M2_REPO/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"/>
<classpathentry kind="var" path="M2_REPO/org/epics/pvDataJava/5.1.0-SNAPSHOT/pvDataJava-5.1.0-SNAPSHOT.jar"/>
<classpathentry kind="var" path="M2_REPO/com/sun/japex/japex-maven-plugin/1.2.4/japex-maven-plugin-1.2.4.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.2.0/maven-plugin-api-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.2.0/maven-project-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-settings/2.2.0/maven-settings-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-model/2.2.0/maven-model-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/2.0.5/plexus-utils-2.0.5.jar"/>
<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-interpolation/1.11/plexus-interpolation-1.11.jar"/>
<classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-9-stable-1/plexus-container-default-1.0-alpha-9-stable-1.jar"/>
<classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.2.0/maven-profile-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact-manager/2.2.0/maven-artifact-manager-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.2.0/maven-repository-metadata-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-artifact/2.2.0/maven-artifact-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-beta-6/wagon-provider-api-1.0-beta-6.jar"/>
<classpathentry kind="var" path="M2_REPO/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-plugin-registry/2.2.0/maven-plugin-registry-2.2.0.jar"/>
<classpathentry kind="var" path="M2_REPO/com/sun/japex/japex/1.2.4/japex-1.2.4.jar"/>
<classpathentry kind="var" path="M2_REPO/jfree/jfreechart/1.0.12/jfreechart-1.0.12.jar"/>
<classpathentry kind="var" path="M2_REPO/jfree/jcommon/1.0.12/jcommon-1.0.12.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-simple/1.6.1/slf4j-simple-1.6.1.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-io/commons-io/2.0.1/commons-io-2.0.1.jar"/>
<classpathentry kind="var" path="M2_REPO/org/epics/jca/2.3.6/jca-2.3.6.jar"/>
<classpathentry kind="var" path="M2_REPO/org/epics/caj/1.1.15/caj-1.1.15.jar"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
34 changes: 12 additions & 22 deletions .settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
#Wed Jan 28 11:03:00 CET 2015
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
21 changes: 15 additions & 6 deletions src/org/epics/pvaccess/client/impl/remote/ChannelImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.epics.pvaccess.impl.remote.TransportSender;
import org.epics.pvaccess.impl.remote.request.ResponseRequest;
import org.epics.pvaccess.impl.remote.request.SubscriptionRequest;
import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvdata.misc.SerializeHelper;
import org.epics.pvdata.misc.TimerFactory;
import org.epics.pvdata.misc.Timer.TimerCallback;
Expand Down Expand Up @@ -145,6 +146,11 @@ public class ChannelImpl implements Channel, SearchInstance, TransportClient, Tr
* User value used by SearchInstance.
*/
private final AtomicInteger userValue = new AtomicInteger();

/**
* GUID of the server hosting the channel.
*/
private GUID serverGUID = null;

/* ****************** */

Expand Down Expand Up @@ -398,6 +404,8 @@ public synchronized void initiateSearch(boolean penalize)
private final static int STATIC_SEARCH_BASE_DELAY_SEC = 5;
private final static int STATIC_SEARCH_MAX_MULTIPLIER = 10;

private static final GUID dummyGUID = new GUID(new byte[12]);

@Override
public void callback() {
// TODO not in this timer thread !!!
Expand All @@ -408,7 +416,7 @@ public void callback() {
addressIndex = addresses.length*STATIC_SEARCH_MAX_MULTIPLIER;

// NOTE: calls channelConnectFailed() on failure
searchResponse(PVAConstants.PVA_PROTOCOL_REVISION, addresses[ix]);
searchResponse(dummyGUID, PVAConstants.PVA_PROTOCOL_REVISION, addresses[ix]);
}

@Override
Expand All @@ -424,19 +432,17 @@ public AtomicInteger getUserValue() {
return userValue;
}

/* (non-Javadoc)
* @see org.epics.pvaccess.client.impl.remote.ChannelSearchManager.SearchInstance#searchResponse(byte, java.net.InetSocketAddress)
*/
@Override
public synchronized void searchResponse(byte minorRevision, InetSocketAddress serverAddress) {
public synchronized void searchResponse(GUID guid, byte minorRevision, InetSocketAddress serverAddress) {
// channel is already automatically unregistered

Transport transport = getTransport();
if (transport != null)
{
// TODO use GUID to determine whether there are multiple servers with the same channel
// multiple defined PV or reconnect request (same server address)
if (!transport.getRemoteAddress().equals(serverAddress))
if (!transport.getRemoteAddress().equals(serverAddress) &&
!guid.equals(serverGUID))
{
requester.message("More than one channel with name '" + name +
"' detected, connected to: " + transport.getRemoteAddress() + ", ignored: " + serverAddress, MessageType.warning);
Expand All @@ -451,6 +457,9 @@ public synchronized void searchResponse(byte minorRevision, InetSocketAddress se
return;
}

// remember GUID
serverGUID = guid;

// create channel
createChannel(transport);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.epics.pvaccess.client.impl.remote.ClientContextImpl;
import org.epics.pvaccess.client.impl.remote.search.ChannelSearchManager;
import org.epics.pvaccess.impl.remote.Transport;
import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvdata.misc.SerializeHelper;


Expand Down Expand Up @@ -83,13 +84,14 @@ public void handleResponse(InetSocketAddress responseFrom, Transport transport,
return;

// reads CIDs
final GUID serverGUID = new GUID(guid);
final ChannelSearchManager csm = context.getChannelSearchManager();
final int count = payloadBuffer.getShort() & 0xFFFF;
for (int i = 0; i < count; i++)
{
transport.ensureData(4);
final int cid = payloadBuffer.getInt();
csm.searchResponse(cid, searchSequenceId, version, responseFrom);
csm.searchResponse(serverGUID, cid, searchSequenceId, version, responseFrom);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

import java.net.InetSocketAddress;

import org.epics.pvaccess.impl.remote.utils.GUID;

/**
* @author <a href="mailto:matej.sekoranjaATcosylab.com">Matej Sekoranja</a>
* @version $Id$
Expand Down Expand Up @@ -49,12 +51,13 @@ public interface ChannelSearchManager {

/**
* Search response from server (channel found).
* @param guid server GUID.
* @param cid client channel ID.
* @param seqNo search sequence number.
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress);
public void searchResponse(GUID guid, int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress);

/**
* Beacon anomaly detected.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import java.net.InetSocketAddress;
import java.util.concurrent.atomic.AtomicInteger;

import org.epics.pvaccess.impl.remote.utils.GUID;

public interface SearchInstance {
int getChannelID();
String getChannelName();
Expand All @@ -25,9 +27,10 @@ public interface SearchInstance {

/**
* Search response from server (channel found).
* @param guid server GUID
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
// TODO make InetSocketAddress an URI or similar
void searchResponse(byte minorRevision, InetSocketAddress serverAddress);
void searchResponse(GUID guid, byte minorRevision, InetSocketAddress serverAddress);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.epics.pvaccess.impl.remote.ProtocolType;
import org.epics.pvaccess.impl.remote.TransportSendControl;
import org.epics.pvaccess.impl.remote.udp.BlockingUDPTransport.InetAddressType;
import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvaccess.util.InetAddressUtil;
import org.epics.pvaccess.util.IntHashMap;
import org.epics.pvdata.misc.SerializeHelper;
Expand Down Expand Up @@ -357,12 +358,13 @@ public void unregister(SearchInstance channel)

/**
* Search response from server (channel found).
* @param guid server GUID.
* @param cid client channel ID.
* @param seqNo search sequence number.
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress)
public void searchResponse(GUID guid, int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress)
{
// first remove
SearchInstance si;
Expand All @@ -374,12 +376,12 @@ public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAdd
// minor hack to enable duplicate reports
si = context.getChannel(cid);
if (si != null)
si.searchResponse(minorRevision, serverAddress);
si.searchResponse(guid, minorRevision, serverAddress);
return;
}

// then notify SearchInstance
si.searchResponse(minorRevision, serverAddress);
si.searchResponse(guid, minorRevision, serverAddress);
}

/**
Expand Down

0 comments on commit ba482f5

Please sign in to comment.