int32_t registerService(const std::string& host, const int32_t port) {
   // Your implementation goes here
   printf("registerService\n");
   pair<string,int> host_tuple(host,port);
   boost::shared_ptr<TTransport> socket(new TSocket(host,port));
   boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
   boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
   boost::shared_ptr<RemoteInfixSearchClient> client(new RemoteInfixSearchClient(protocol));
   thrift_container_t container;
   container.host = host;
   container.port = port;
   container.socket = socket;
   container.transport = transport;
   container.protocol = protocol;
   container.client = client;
   bool found = false;
   for(host_list_t::iterator it = host_list.begin();it!=host_list.end();++it){
     thrift_container_t container = *it;
     if(container.host.compare(host)==0 && container.port==port){
       printf("Found a matching entry\n");
       found = true;
       break;
     }
   }
   if(!found) host_list.push_back(container);
   printf("There are now %u workers\n",(uint)host_list.size());
 }
 int32_t deregisterService(const std::string& host, const int32_t port) {
   // Your implementation goes here
   printf("deregisterService\n");
   pair<string,int> host_tuple(host,port);
   host_list_t::iterator it = host_list.begin();
   while(it!=host_list.end()){
     thrift_container_t container = *it;
     if(container.host.compare(host)==0 && container.port==port){
       printf("Found a matching entry\n");
       it = host_list.erase(it);
     }else{
       ++it;
     }
   }
   printf("There are now %u workers\n",(uint)host_list.size());
 }
    bool server_control_executor::is_host_in_list(
        const std::string& _hn,
        const host_list_t& _hosts ) {
        for ( size_t i = 0;
                i < _hosts.size();
                ++i ) {
            if ( compare_host_names(
                        _hn,
                        _hosts[ i ] ) ) {
                return true;
            }

        } // for i

        return false;

    } // is_host_in_list
  void findMatches(std::vector<std::string> & _return, const std::string& key) {
    // Your implementation goes here
    printf("findMatches\n");
    if(service_type ==  TYPE_SLAVE){
      search.find_path(key,_return);
      for(int i=0;i<_return.size();++i){
        _return[i] = search.extract_row(_return[i]);
      }
    }else{
      if(host_list.size()>0){
        _return.clear();
        list<delegator_t *> delegator_list;
        for(host_list_t::iterator it = host_list.begin();it!=host_list.end();++it){
          thrift_container_t container = *it;
          delegator_t * delegator = new delegator_t(container,key);
          delegator_list.push_back(delegator);
        }
        findMatchesThreaded(_return,key,delegator_list);
        for(list<delegator_t *>::iterator it = delegator_list.begin();
        it!=delegator_list.end();++it){
          delegator_t * delegator = *it;
          for(vector<string>::iterator it = delegator->matches.begin();
          it!=delegator->matches.end();++it){
             _return.push_back(*it);
          }
          delete(delegator);
//          try {
//            printf("Trying host %s port %d\n",container.host.data(),container.port);
//            container.transport->open();
//            vector<string> matches;
//            container.client->findMatches(matches,key);
//            container.transport->close();
//            for(vector<string>::iterator it = matches.begin();it!=matches.end();++it){
//              _return.push_back(*it);
//            }
//          }catch(TException & tx){
//            cout<<"ERROR: "<<tx.what()<<endl;
//          }
        }
      }
    }
  }