foxpluto opened a new issue, #1204:
URL: https://github.com/apache/plc4x/issues/1204

   ### What happened?
   
   HI,
   
   I am testing the `CachedPlcConnectionManager` and I found a bug. 
   I am using PLC Siemens S7 1200, I am testing the reliability of the 
communication between PLC4x and PLC in case of drop of the connection. This is 
quite important for me because the PLC is not always connected to the server I 
am using to query data to the PLC. 
   The code I wrote to distribute the  `CachedPlcConnectionManager` is:
   ```java
       /**
        * Build up a new {@link CachedPlcConnectionManager}
        */
       private CachedPlcConnectionManager getNew() {
   
           CachedPlcConnectionManager cachedPlcConnectionManagerTemp = 
CachedPlcConnectionManager.getBuilder()
                                                                                
                 .withMaxLeaseTime(Duration.ofMillis(700))
                                                                                
                 .withMaxWaitTime(Duration.ofMillis(1000))
                                                                                
                 .build();
           log.warn("New Driver Manager Found: {}", 
cachedPlcConnectionManagerTemp);
           return cachedPlcConnectionManagerTemp;
       }
   ```
   This method is used to get the connection in various part of my code in this 
way: 
   
   ```java
   try (var plcConnection = 
cachedPlcConnectionManager.getConnection(plcConnectionString)) {
   .... do stuff
   }
   ```
   
   Everything is fine since I don't plug the cable for testing the reliability, 
the errors are correctly trapped and handled but as soon as the connection is 
back I got this error: 
   
   ```java
   [DEBUG] 22:26:28.089 
org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager.getConnection() - 
Reusing exising connection
   [WARN ] 22:26:29.422 
org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic.lambda$0() - 
Timeout during Connection establishing, closing channel...
   [WARN ] 22:26:29.426 
io.netty.channel.AbstractChannelHandlerContext.tryFailure() - Failed to mark a 
promise as failure because it has succeeded already: 
DefaultChannelPromise@50a28038(success)
    java.lang.IllegalStateException: HashedWheelTimer.stop() cannot be called 
from TimerTask
           at io.netty.util.HashedWheelTimer.stop(HashedWheelTimer.java:393) 
~[netty-common-4.1.99.Final.jar:4.1.99.Final]
           at 
org.apache.plc4x.java.spi.netty.NettyHashTimerTimeoutManager.stop(NettyHashTimerTimeoutManager.java:63)
 ~[plc4j-spi-0.11.0.jar:0.11.0]
           at 
org.apache.plc4x.java.spi.Plc4xNettyWrapper.close(Plc4xNettyWrapper.java:130) 
~[plc4j-spi-0.11.0.jar:0.11.0]
           at 
io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:751)
 ~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.channel.AbstractChannelHandlerContext.close(AbstractChannelHandlerContext.java:727)
 ~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.channel.DefaultChannelPipeline.close(DefaultChannelPipeline.java:994) 
~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at io.netty.channel.AbstractChannel.close(AbstractChannel.java:280) 
~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.channel.embedded.EmbeddedChannel.close(EmbeddedChannel.java:569) 
~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.channel.embedded.EmbeddedChannel.close(EmbeddedChannel.java:556) 
~[netty-transport-4.1.99.Final.jar:4.1.99.Final]
           at 
org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic.lambda$0(S7ProtocolLogic.java:156)
 ~[plc4j-driver-s7-0.11.0.jar:0.11.0]
           at 
org.apache.plc4x.java.spi.Plc4xNettyWrapper$3.accept(Plc4xNettyWrapper.java:245)
 ~[plc4j-spi-0.11.0.jar:0.11.0]
           at 
org.apache.plc4x.java.spi.Plc4xNettyWrapper$3.accept(Plc4xNettyWrapper.java:1) 
~[plc4j-spi-0.11.0.jar:0.11.0]
           at 
org.apache.plc4x.java.spi.netty.NettyHashTimerTimeoutManager.lambda$0(NettyHashTimerTimeoutManager.java:55)
 ~[plc4j-spi-0.11.0.jar:0.11.0]
           at 
io.netty.util.HashedWheelTimer$HashedWheelTimeout.run(HashedWheelTimer.java:715)
 [netty-common-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.util.concurrent.ImmediateExecutor.execute(ImmediateExecutor.java:34) 
[netty-common-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:703)
 [netty-common-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:790)
 [netty-common-4.1.99.Final.jar:4.1.99.Final]
           at 
io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:503) 
[netty-common-4.1.99.Final.jar:4.1.99.Final]
           at java.lang.Thread.run(Thread.java:833) [?:?]
   ```
   
   Since that error all the request made to have a connection from the 
`CachedPlcConnectionManager` got stuck, never exit and my entire application is 
dead waiting forever a connection !!!! 
   
   As you can see from the log the problem is inside the driver: 
   ```
   java.lang.IllegalStateException: HashedWheelTimer.stop() cannot be called 
from TimerTask
   ```
   That's a very scary error !!!
   
   What happen here?
   
   Thanks,
   S.
   
   
   
   ### Version
   
   V0.11.0
   
   ### Programming Languages
   
   - [X] plc4j
   - [ ] plc4go
   - [ ] plc4c
   - [ ] plc4net
   
   ### Protocols
   
   - [ ] AB-Ethernet
   - [ ] ADS /AMS
   - [ ] BACnet/IP
   - [ ] CANopen
   - [ ] DeltaV
   - [ ] DF1
   - [ ] EtherNet/IP
   - [ ] Firmata
   - [ ] KNXnet/IP
   - [ ] Modbus
   - [ ] OPC-UA
   - [X] S7


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to