[ 
https://issues.apache.org/jira/browse/THRIFT-5547?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

julien greard updated THRIFT-5547:
----------------------------------
    Description: 
Hello,

I have the following architecture in my code:

 * 1 thrift Server 
 * 1 thrift MultiplexedProcessor 
 * several Services & associated processors/handlers 
 * N thrift clients (several by processor/handler) 
 * 1 queue which contains the tasks asked by the clients

What I*really*want is to be able cancel a task when a client crashes.

Let me explain:

Let's say I have the following service handler method :
|// inside thrift handler
// this method is currently instanciated once and called by every client
void do_stuff(const std::string& parameter) { 
auto task = make_task(parameter); 
auto future_result = task .get_future(); 
add_to_queue(task); 
auto status = resultFuture.wait_for(timeout); // wait here until the task is 
over 
if (status != std::future_status::timeout)
{
    return future_result.get();
}
}|

If the client crashes/disconnects, there is no need to process with the task 
anymore, so I would like to cancel it (remove from my queue) asap.

To do so, I had the following ideas:

1/ Using the*setServerEventHandler*method from my Thrift Server to be notified 
when a client disconnects (deleteContext method). It works very well but I am 
not able to know which request was made by which specific client: within my 
handler I do not have access to the client infos, and I can't use (or didnt 
managed to) the void * context created by the method creatContext in my 
ServerEventHandler

2/ Using the contructor & destructor of my handler object to link 1 client to 1 
handler. Then when the client disconnects, I only have to cancel every task he 
asked in the handler destructor. Currently I have N client and 1 handler, so it 
doesn't work. I figured I could use a TMultiplexedProcessorFactory but there is 
no such class in thrift. The TMultiplexedProcessor has to register Processor 
(with single handler) when I'd like to register a Factory which will create one 
handler instance by client. I could implement my own 
TMultiplexedProcessorFactory but I think there might be a good reason this 
doesn't exist yet.

Any idea of what I should do ?

I can post it inhttps://issues.apache.org/but it's not exactly an issue with 
thrift (great lib btw), rather than a question.

Thanks in advance, don't hesitate to ask for more details

This post is a duplicate of a StackOverflow question I asked last Friday 
[<https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift>|https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift]

Thanks in advance,

Julien Greard 

 

 

There has been an answer to this request in 
[dev@thrift.apache.org|mailto:dev@thrift.apache.org] : the user Yuxuan Wang has 
described having the same issue in Go and he solved it by adding  a context to 
the handler services + a thread watchding regularly the opened sockets

  was:
Hello, 

I have the following architecture in my code: 

 * 1 thrift Server 
 * 1 thrift MultiplexedProcessor 
 * several Services & associated processors/handlers 
 * N thrift clients (several by processor/handler) 
 * 1 queue which contains the tasks asked by the clients 

What I*really*want is to be able cancel a task when a client crashes. 

Let me explain: 

Let's say I have the following service handler method : 

|// inside thrift handler // this method is currently instanciated once and 
called by every client void do_stuff(const std::string& parameter) \{ auto task 
= make_task(parameter); auto future_result = task .get_future(); 
add_to_queue(task); auto status = resultFuture.wait_for(timeout); // wait here 
until the task is over if (status != std::future_status::timeout) { return 
future_result.get(); } } | 

If the client crashes/disconnects, there is no need to process with the task 
anymore, so I would like to cancel it (remove from my queue) asap. 

To do so, I had the following ideas: 

1/ Using the*setServerEventHandler*method from my Thrift Server to be notified 
when a client disconnects (deleteContext method). It works very well but I am 
not able to know which request was made by which specific client: within my 
handler I do not have access to the client infos, and I can't use (or didnt 
managed to) the void * context created by the method creatContext in my 
ServerEventHandler 

2/ Using the contructor & destructor of my handler object to link 1 client to 1 
handler. Then when the client disconnects, I only have to cancel every task he 
asked in the handler destructor. Currently I have N client and 1 handler, so it 
doesn't work. I figured I could use a TMultiplexedProcessorFactory but there is 
no such class in thrift. The TMultiplexedProcessor has to register Processor 
(with single handler) when I'd like to register a Factory which will create one 
handler instance by client. I could implement my own 
TMultiplexedProcessorFactory but I think there might be a good reason this 
doesn't exist yet. 

Any idea of what I should do ? 

I can post it inhttps://issues.apache.org/but it's not exactly an issue with 
thrift (great lib btw), rather than a question. 

Thanks in advance, don't hesitate to ask for more details 


This post is a duplicate of a StackOverflow question I asked last Friday 
[<https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift>|https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift]
 


Thanks in advance, 


Julien Greard 

 

 

There has been an answer to this request in 
[dev@thrift.apache.org|mailto:dev@thrift.apache.org] : the user Yuxuan Wang has 
described having the same issue in Go and he solved it by adding  a context to 
the handler services + a thread watchding regularly the opened sockets


> C++ - Can't interrupt the handler on the server side while using 
> TMultiplexedProcessor in case of client deconnection
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: THRIFT-5547
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5547
>             Project: Thrift
>          Issue Type: Brainstorming
>          Components: C++ - Library
>    Affects Versions: 0.16.0
>            Reporter: julien greard
>            Priority: Major
>
> Hello,
> I have the following architecture in my code:
>  * 1 thrift Server 
>  * 1 thrift MultiplexedProcessor 
>  * several Services & associated processors/handlers 
>  * N thrift clients (several by processor/handler) 
>  * 1 queue which contains the tasks asked by the clients
> What I*really*want is to be able cancel a task when a client crashes.
> Let me explain:
> Let's say I have the following service handler method :
> |// inside thrift handler
> // this method is currently instanciated once and called by every client
> void do_stuff(const std::string& parameter) { 
> auto task = make_task(parameter); 
> auto future_result = task .get_future(); 
> add_to_queue(task); 
> auto status = resultFuture.wait_for(timeout); // wait here until the task is 
> over 
> if (status != std::future_status::timeout)
> {
>     return future_result.get();
> }
> }|
> If the client crashes/disconnects, there is no need to process with the task 
> anymore, so I would like to cancel it (remove from my queue) asap.
> To do so, I had the following ideas:
> 1/ Using the*setServerEventHandler*method from my Thrift Server to be 
> notified when a client disconnects (deleteContext method). It works very well 
> but I am not able to know which request was made by which specific client: 
> within my handler I do not have access to the client infos, and I can't use 
> (or didnt managed to) the void * context created by the method creatContext 
> in my ServerEventHandler
> 2/ Using the contructor & destructor of my handler object to link 1 client to 
> 1 handler. Then when the client disconnects, I only have to cancel every task 
> he asked in the handler destructor. Currently I have N client and 1 handler, 
> so it doesn't work. I figured I could use a TMultiplexedProcessorFactory but 
> there is no such class in thrift. The TMultiplexedProcessor has to register 
> Processor (with single handler) when I'd like to register a Factory which 
> will create one handler instance by client. I could implement my own 
> TMultiplexedProcessorFactory but I think there might be a good reason this 
> doesn't exist yet.
> Any idea of what I should do ?
> I can post it inhttps://issues.apache.org/but it's not exactly an issue with 
> thrift (great lib btw), rather than a question.
> Thanks in advance, don't hesitate to ask for more details
> This post is a duplicate of a StackOverflow question I asked last Friday 
> [<https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift>|https://stackoverflow.com/questions/71707726/using-a-processor-factory-with-tmultiplexedprocessor-in-thrift]
> Thanks in advance,
> Julien Greard 
>  
>  
> There has been an answer to this request in 
> [dev@thrift.apache.org|mailto:dev@thrift.apache.org] : the user Yuxuan Wang 
> has described having the same issue in Go and he solved it by adding  a 
> context to the handler services + a thread watchding regularly the opened 
> sockets



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to