/*
 * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
 * (the "License"). You may not use this work except in compliance with the License, which is
 * available at www.apache.org/licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied, as more fully set forth in the License.
 *
 * See the NOTICE file distributed with this work for information regarding copyright ownership.
 */

package alluxio.client;

import alluxio.AbstractMasterClient;
import alluxio.Constants;
import alluxio.master.MasterClientConfig;
import alluxio.thrift.AlluxioService;
import alluxio.thrift.GetMasterInfoTOptions;
import alluxio.thrift.MetaMasterClientService;
import alluxio.wire.MasterInfo;
import alluxio.wire.MasterInfo.MasterInfoField;

import org.apache.thrift.TException;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.annotation.concurrent.ThreadSafe;

/**
 * A wrapper for the thrift client to interact with the meta master.
 *
 * Since thrift clients are not thread safe, this class is a wrapper to provide thread safety and
 * support for retries.
 */
@ThreadSafe
public final class RetryHandlingMetaMasterClient extends AbstractMasterClient
    implements MetaMasterClient {
  private MetaMasterClientService.Client mClient;

  /**
   * Creates a new meta master client.
   *
   * @param conf master client configuration
   */
  public RetryHandlingMetaMasterClient(MasterClientConfig conf) {
    super(conf);
  }

  @Override
  protected AlluxioService.Client getClient() {
    return mClient;
  }

  @Override
  protected String getServiceName() {
    return Constants.META_MASTER_SERVICE_NAME;
  }

  @Override
  protected long getServiceVersion() {
    return Constants.META_MASTER_CLIENT_SERVICE_VERSION;
  }

  @Override
  protected void afterConnect() {
    mClient = new MetaMasterClientService.Client(mProtocol);
  }

  @Override
  public synchronized MasterInfo getInfo(final Set<MasterInfoField> fields) throws IOException {
    return retryRPC(new RpcCallable<MasterInfo>() {
      @Override
      public MasterInfo call() throws TException {
        Set<alluxio.thrift.MasterInfoField> thriftFields = new HashSet<>();
        if (fields == null) {
          thriftFields = null;
        } else {
          for (MasterInfoField field : fields) {
            thriftFields.add(field.toThrift());
          }
        }
        return MasterInfo.fromThrift(
            mClient.getMasterInfo(new GetMasterInfoTOptions(thriftFields)).getMasterInfo());
      }
    });
  }
}

@@ -2122,109 +2122,16 @@
 RPC(
-new RpcCallable%3CMasterInfo%3E() %7B%0A      @Override%0A      public MasterInfo call() throws TException
+() -%3E
  %7B%0A
-  
     
@@ -2206,18 +2206,16 @@
 ;%0A      
-  
 if (fiel
@@ -2228,34 +2228,32 @@
 null) %7B%0A        
-  
 thriftFields = n
@@ -2263,18 +2263,16 @@
 ;%0A      
- 
- 
 %7D else %7B
@@ -2272,18 +2272,16 @@
  else %7B%0A
-  
         
@@ -2325,26 +2325,24 @@
 %7B%0A          
- 
- 
 thriftFields
@@ -2373,26 +2373,24 @@
         
-  
 %7D%0A      
   %7D%0A    
@@ -2377,30 +2377,26 @@
     %7D%0A      
- 
- 
 %7D%0A
-  
       return
@@ -2419,20 +2419,16 @@
 Thrift(%0A
-    
         
@@ -2508,24 +2508,16 @@
 nfo());%0A
-      %7D%0A
     %7D);%0A

replace anonymous type with lambda in RetryHandlingMetaMasterClient