[ 
https://issues.apache.org/jira/browse/TRAFODION-2717?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16150579#comment-16150579
 ] 

ASF GitHub Bot commented on TRAFODION-2717:
-------------------------------------------

Github user selvaganesang commented on a diff in the pull request:

    
https://github.com/apache/incubator-trafodion/pull/1209#discussion_r136582435
  
    --- Diff: 
dcs/src/main/java/org/trafodion/dcs/master/listener/ListenerWorker.java ---
    @@ -86,39 +86,43 @@ public void run() {
             DataEvent dataEvent;
         
             while(true) {
    -            // Wait for data to become available
    -            synchronized(queue) {
    -                while(queue.isEmpty()) {
    -                    try {
    -                        queue.wait();
    -                    } catch (InterruptedException e) {
    +            try {
    +                // Wait for data to become available
    +                synchronized(queue) {
    +                    while(queue.isEmpty()) {
    +                        try {
    +                            queue.wait();
    +                        } catch (InterruptedException e) {
    +                        }
                         }
    +                    dataEvent = queue.remove(0);
                     }
    -                dataEvent = queue.remove(0);
    -            }
    -            SelectionKey key = dataEvent.key;
    -            SocketChannel client = (SocketChannel) key.channel();
    -            Socket s = client.socket();
    -            ClientData clientData = (ClientData) key.attachment();
    -            ListenerService server = dataEvent.server;
    -            dataEvent.key = null;
    -            dataEvent.server = null;
    -            
    -            switch (clientData.hdr.getOperationId()){
    -                case ListenerConstants.DCS_MASTER_GETSRVRAVAILABLE:
    -                    clientData = 
requestGetObjectRef.processRequest(clientData, s);
    -                    break;
    -                case ListenerConstants.DCS_MASTER_CANCELQUERY:
    -                    clientData = 
requestCancelQuery.processRequest(clientData, s);
    -                    break;
    -                default:
    -                    clientData = requestUnknown.processRequest(clientData, 
s);
    -                    break;
    +                SelectionKey key = dataEvent.key;
    +                SocketChannel client = (SocketChannel) key.channel();
    +                Socket s = client.socket();
    +                ClientData clientData = (ClientData) key.attachment();
    +                ListenerService server = dataEvent.server;
    +                dataEvent.key = null;
    +                dataEvent.server = null;
    +
    +                switch (clientData.hdr.getOperationId()){
    +                    case ListenerConstants.DCS_MASTER_GETSRVRAVAILABLE:
    +                        clientData = 
requestGetObjectRef.processRequest(clientData, s);
    +                        break;
    +                    case ListenerConstants.DCS_MASTER_CANCELQUERY:
    +                        clientData = 
requestCancelQuery.processRequest(clientData, s);
    +                        break;
    +                    default:
    +                        clientData = 
requestUnknown.processRequest(clientData, s);
    +                        break;
    +                }
    +                // Return to sender
    +                int requestReply = clientData.requestReply;
    +                key.attach(clientData);
    +                server.send(new PendingRequest(key, requestReply));
    +            } catch (Exception e){
    +                LOG.error("Unexpected Exception", e);
    --- End diff --
    
    So, you want to do something like the program below that prints 100 times 
null pointer exception instead of exiting the process. 
    
    public class TestS
    {
       public static void main(String args[])
       {
          for (int i = 0; i < 100; i++)
          {
             String s = null;
             try
             {
                System.out.println ("Length of the string " + s.length());
             } catch (Exception e) {
                e.printStackTrace();
             }
          }
       }
    }
    
    But serious errors like OutOfMemoryError will anyway won't be caught by 
this handler. So, do you think it is ok for DCSMaster to hang then.  
    
    My earlier comment is to ensure that all unchecked exceptions (Runtime 
Exceptions or any exception that need not be caught or thrown) should also be 
treated like critical error as above.  I would say if you want DCS Master not 
to hang at all conditions, then it can't be done by handling exceptions. 
    
    If you attempt to avoid this hang by handling Throwable like catch 
(Throwable t), then it very bad because the only way to recover from this 
situation is to kill the process manually, which would have happened 
automatically if you didn't handle Throwable.


> DCSMaster can't solve error data send from odbc and hang
> --------------------------------------------------------
>
>                 Key: TRAFODION-2717
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-2717
>             Project: Apache Trafodion
>          Issue Type: Bug
>            Reporter: mashengchen
>            Assignee: mashengchen
>
> odbc give a wrong length for dcsmaster when do new byte[length], then throw 
> exception, but not catch it, this lead to client can't get response, and 
> dcsmaster hang.
> 2017-08-09 18:13:57,497, ERROR, 
> org.trafodion.dcs.master.listener.ListenerWorker, Node Number: , CPU: , PID: 
> , Process Name: , , ,Unexpected Exception
> java.nio.BufferUnderflowException
>         at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:151)
>         at org.trafodion.dcs.master.listener.Util.extractString(Util.java:59)
>         at 
> org.trafodion.dcs.master.listener.ConnectionContext.extractFromByteBuffer(ConnectionContext.java:170)
>         at 
> org.trafodion.dcs.master.listener.RequestGetObjectRef.buildConnectReply(RequestGetObjectRef.java:96)
>         at 
> org.trafodion.dcs.master.listener.RequestGetObjectRef.processRequest(RequestGetObjectRef.java:61)
>         at 
> org.trafodion.dcs.master.listener.ListenerWorker.run(ListenerWorker.java:113)



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to