This is from the gateway code (gateVc.cc):
caStatus gateVcData::write(const casCtx& ctx, const gdd& dd, gateChan
&/*chan*/)
{
int docallback=GATE_DOCALLBACK;
[...]
switch(at) {
[...]
case gddAppType_ackt:
case gddAppType_acks:
docallback = GATE_NOCALLBACK;
// Fall through
default:
[...]
caStatus stat = pv->put(&dd, docallback);
if(stat != S_casApp_success) return stat;
if(docallback) {
// Start a pending write
#if DEBUG_GDD
fflush(stderr);
printf("pending_write\n");
fflush(stdout);
#endif
pending_write = new gatePendingWrite(*this,ctx,dd);
if(!pending_write) return S_casApp_noMemory;
else return S_casApp_asyncCompletion;
} else {
return S_casApp_success;
}
It seems that ALL puts except alarm handler ackt and acks are done with
callback. There is no direct flag to write() from the generic CA server
which indicates writes with or without callback, as far as I can see.
But the gateway should have look at the CA command in ctx, probably like
this:
if (ctx.getMsg()->m_cmmd == CA_PROTO_WRITE_NOTIFY) {
docallback == GATE_DOCALLBACK;
} else {
docallback == GATE_NOCALLBACK;
}
Dirk
Leicester, PJ (Pete) wrote:
I can confirm that the problem appears isolated to the scaler record CNT
field and not enums in general.
It looks like Tim's ca_put_callback theory may be correct. Is there a
Gateway expert out there who can confirm this? How are writes done from
the Gateway. Does it always use ca_put_callback regardless of how the
put reached the gateway?
Thanks for everyones responses on this.
Pete Leicester
Diamond
-----Original Message-----
From: Tim Mooney [mailto:[email protected]]
Sent: 28 March 2006 21:07
To: Leicester, PJ (Pete)
Cc: [email protected]
Subject: Re: gateway enum writes
Leicester, PJ (Pete) wrote:
I am getting some strange behaviour when writing enumerations through
the Gateway (version 2.0.0.0 on 3.14.8.2 and RedHat Enterprise 4).
The problem first showed itself in edm when pressing a button on a edm
screen to send the value resulted in the following error:
CA.Client.Exception...............................................
Warning: "Virtual circuit unresponsive"
Context: "diamrs0005l.diamond.ac.uk:6064"
Source File: ../tcpiiu.cpp line 896
Current Time: Tue Mar 28 2006 16:19:01.334736000
..................................................................
I did some further tests using caput with similar results:
[pjl45@pc0005 pjl45]$ caput -w15 GDA:scaler2.CNT Count
Old : GDA:scaler2.CNT Done
Read operation timed out: PV data was not read.
New : GDA:scaler2.CNT
CA.Client.Exception...............................................
Warning: "Virtual circuit disconnect"
Context: "op=0, channel=GDA:scaler2.CNT, type=DBR_TIME_STRING,
count=1, ctx="diamrs0005l.diamond.ac.uk:6064""
Source File: ../getCopy.cpp line 82
Current Time: Tue Mar 28 2006 17:04:24.488496000
.
Despite the above error message the write does actually reach the IOC.
However if I now try the change the value back as follows:
[pjl45@pc0005 pjl45]$ caput -w15 GDA:scaler2.CNT Done
Old : GDA:scaler2.CNT Count
Read operation timed out: PV data was not read.
New : GDA:scaler2.CNT
CA.Client.Exception...............................................
Warning: "Virtual circuit disconnect"
Context: "op=0, channel=GDA:scaler2.CNT, type=DBR_TIME_STRING,
count=1, ctx="diamrs0005l.diamond.ac.uk:6064""
Source File: ../getCopy.cpp line 82
Current Time: Tue Mar 28 2006 17:22:36.167980000
..................................................................
I get an error again however this time the 'Done' value gets written
to
the IOC exactly ONE MINUTE after I entered the caput command. This is
long after the caput command has timed out so it appears the gateway
is
responsible for the delay?
Has anyone any idea what may be happening? Is there a 60 second
timeout
in CA or the gateway which may give a clue as to what I am seeing?
(For the record this test was done with a very lightly loaded test
gateway serving only 20 or so PV's. Also using caput -w70 results in
the
same timeouts)
Do you get this kind of result with *all* enum fields that you write to
through the gateway, or only this one? The scaler record's CNT field is
different from other enum's in that it starts an operation that may take
a long time to complete. I don't know what the gateway is using to do
put's, but if it should happen to be ca_put_callback(), the gateway may
be waiting for a callback that will come only after the scaler has
finished counting.
--
Dr. Dirk Zimoch
Swiss Light Source
Paul Scherrer Institut
Computing and Controls
phone +41 56 310 5182
fax +41 56 310 4413
- Replies:
- RE: gateway enum writes Jeff Hill
- References:
- RE: gateway enum writes Leicester, PJ (Pete)
- Navigate by Date:
- Prev:
RE: gateway enum writes Leicester, PJ (Pete)
- Next:
RE: gateway enum writes Jeff Hill
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
<2006>
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
- Navigate by Thread:
- Prev:
RE: gateway enum writes Leicester, PJ (Pete)
- Next:
RE: gateway enum writes Jeff Hill
- Index:
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
<2006>
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
|