1 year ago

#363784

test-img

Julien Greard

Using a processor factory with TMultiplexedProcessor in thrift

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 in https://issues.apache.org/ but it's not exactly an issue with thrift (great lib btw), rather than a question, ie SO.

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

c++

thrift

0 Answers

Your Answer

Accepted video resources