accumulo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ktur...@apache.org
Subject [2/6] accumulo git commit: ACCUMULO-1798 Add ability to specify compaction strategy for user specificed compactions.
Date Fri, 05 Dec 2014 03:51:32 GMT
http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/java/org/apache/accumulo/proxy/thrift/CompactionStrategyConfig.java
----------------------------------------------------------------------
diff --git a/proxy/src/main/java/org/apache/accumulo/proxy/thrift/CompactionStrategyConfig.java b/proxy/src/main/java/org/apache/accumulo/proxy/thrift/CompactionStrategyConfig.java
new file mode 100644
index 0000000..2ece009
--- /dev/null
+++ b/proxy/src/main/java/org/apache/accumulo/proxy/thrift/CompactionStrategyConfig.java
@@ -0,0 +1,556 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.accumulo.proxy.thrift;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("all") public class CompactionStrategyConfig implements org.apache.thrift.TBase<CompactionStrategyConfig, CompactionStrategyConfig._Fields>, java.io.Serializable, Cloneable, Comparable<CompactionStrategyConfig> {
+  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("CompactionStrategyConfig");
+
+  private static final org.apache.thrift.protocol.TField CLASS_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("className", org.apache.thrift.protocol.TType.STRING, (short)1);
+  private static final org.apache.thrift.protocol.TField OPTIONS_FIELD_DESC = new org.apache.thrift.protocol.TField("options", org.apache.thrift.protocol.TType.MAP, (short)2);
+
+  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
+  static {
+    schemes.put(StandardScheme.class, new CompactionStrategyConfigStandardSchemeFactory());
+    schemes.put(TupleScheme.class, new CompactionStrategyConfigTupleSchemeFactory());
+  }
+
+  public String className; // required
+  public Map<String,String> options; // required
+
+  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
+  @SuppressWarnings("all") public enum _Fields implements org.apache.thrift.TFieldIdEnum {
+    CLASS_NAME((short)1, "className"),
+    OPTIONS((short)2, "options");
+
+    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
+
+    static {
+      for (_Fields field : EnumSet.allOf(_Fields.class)) {
+        byName.put(field.getFieldName(), field);
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, or null if its not found.
+     */
+    public static _Fields findByThriftId(int fieldId) {
+      switch(fieldId) {
+        case 1: // CLASS_NAME
+          return CLASS_NAME;
+        case 2: // OPTIONS
+          return OPTIONS;
+        default:
+          return null;
+      }
+    }
+
+    /**
+     * Find the _Fields constant that matches fieldId, throwing an exception
+     * if it is not found.
+     */
+    public static _Fields findByThriftIdOrThrow(int fieldId) {
+      _Fields fields = findByThriftId(fieldId);
+      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
+      return fields;
+    }
+
+    /**
+     * Find the _Fields constant that matches name, or null if its not found.
+     */
+    public static _Fields findByName(String name) {
+      return byName.get(name);
+    }
+
+    private final short _thriftId;
+    private final String _fieldName;
+
+    _Fields(short thriftId, String fieldName) {
+      _thriftId = thriftId;
+      _fieldName = fieldName;
+    }
+
+    public short getThriftFieldId() {
+      return _thriftId;
+    }
+
+    public String getFieldName() {
+      return _fieldName;
+    }
+  }
+
+  // isset id assignments
+  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
+  static {
+    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
+    tmpMap.put(_Fields.CLASS_NAME, new org.apache.thrift.meta_data.FieldMetaData("className", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
+    tmpMap.put(_Fields.OPTIONS, new org.apache.thrift.meta_data.FieldMetaData("options", org.apache.thrift.TFieldRequirementType.DEFAULT, 
+        new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, 
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), 
+            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
+    metaDataMap = Collections.unmodifiableMap(tmpMap);
+    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(CompactionStrategyConfig.class, metaDataMap);
+  }
+
+  public CompactionStrategyConfig() {
+  }
+
+  public CompactionStrategyConfig(
+    String className,
+    Map<String,String> options)
+  {
+    this();
+    this.className = className;
+    this.options = options;
+  }
+
+  /**
+   * Performs a deep copy on <i>other</i>.
+   */
+  public CompactionStrategyConfig(CompactionStrategyConfig other) {
+    if (other.isSetClassName()) {
+      this.className = other.className;
+    }
+    if (other.isSetOptions()) {
+      Map<String,String> __this__options = new HashMap<String,String>(other.options);
+      this.options = __this__options;
+    }
+  }
+
+  public CompactionStrategyConfig deepCopy() {
+    return new CompactionStrategyConfig(this);
+  }
+
+  @Override
+  public void clear() {
+    this.className = null;
+    this.options = null;
+  }
+
+  public String getClassName() {
+    return this.className;
+  }
+
+  public CompactionStrategyConfig setClassName(String className) {
+    this.className = className;
+    return this;
+  }
+
+  public void unsetClassName() {
+    this.className = null;
+  }
+
+  /** Returns true if field className is set (has been assigned a value) and false otherwise */
+  public boolean isSetClassName() {
+    return this.className != null;
+  }
+
+  public void setClassNameIsSet(boolean value) {
+    if (!value) {
+      this.className = null;
+    }
+  }
+
+  public int getOptionsSize() {
+    return (this.options == null) ? 0 : this.options.size();
+  }
+
+  public void putToOptions(String key, String val) {
+    if (this.options == null) {
+      this.options = new HashMap<String,String>();
+    }
+    this.options.put(key, val);
+  }
+
+  public Map<String,String> getOptions() {
+    return this.options;
+  }
+
+  public CompactionStrategyConfig setOptions(Map<String,String> options) {
+    this.options = options;
+    return this;
+  }
+
+  public void unsetOptions() {
+    this.options = null;
+  }
+
+  /** Returns true if field options is set (has been assigned a value) and false otherwise */
+  public boolean isSetOptions() {
+    return this.options != null;
+  }
+
+  public void setOptionsIsSet(boolean value) {
+    if (!value) {
+      this.options = null;
+    }
+  }
+
+  public void setFieldValue(_Fields field, Object value) {
+    switch (field) {
+    case CLASS_NAME:
+      if (value == null) {
+        unsetClassName();
+      } else {
+        setClassName((String)value);
+      }
+      break;
+
+    case OPTIONS:
+      if (value == null) {
+        unsetOptions();
+      } else {
+        setOptions((Map<String,String>)value);
+      }
+      break;
+
+    }
+  }
+
+  public Object getFieldValue(_Fields field) {
+    switch (field) {
+    case CLASS_NAME:
+      return getClassName();
+
+    case OPTIONS:
+      return getOptions();
+
+    }
+    throw new IllegalStateException();
+  }
+
+  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
+  public boolean isSet(_Fields field) {
+    if (field == null) {
+      throw new IllegalArgumentException();
+    }
+
+    switch (field) {
+    case CLASS_NAME:
+      return isSetClassName();
+    case OPTIONS:
+      return isSetOptions();
+    }
+    throw new IllegalStateException();
+  }
+
+  @Override
+  public boolean equals(Object that) {
+    if (that == null)
+      return false;
+    if (that instanceof CompactionStrategyConfig)
+      return this.equals((CompactionStrategyConfig)that);
+    return false;
+  }
+
+  public boolean equals(CompactionStrategyConfig that) {
+    if (that == null)
+      return false;
+
+    boolean this_present_className = true && this.isSetClassName();
+    boolean that_present_className = true && that.isSetClassName();
+    if (this_present_className || that_present_className) {
+      if (!(this_present_className && that_present_className))
+        return false;
+      if (!this.className.equals(that.className))
+        return false;
+    }
+
+    boolean this_present_options = true && this.isSetOptions();
+    boolean that_present_options = true && that.isSetOptions();
+    if (this_present_options || that_present_options) {
+      if (!(this_present_options && that_present_options))
+        return false;
+      if (!this.options.equals(that.options))
+        return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return 0;
+  }
+
+  @Override
+  public int compareTo(CompactionStrategyConfig other) {
+    if (!getClass().equals(other.getClass())) {
+      return getClass().getName().compareTo(other.getClass().getName());
+    }
+
+    int lastComparison = 0;
+
+    lastComparison = Boolean.valueOf(isSetClassName()).compareTo(other.isSetClassName());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetClassName()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.className, other.className);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    lastComparison = Boolean.valueOf(isSetOptions()).compareTo(other.isSetOptions());
+    if (lastComparison != 0) {
+      return lastComparison;
+    }
+    if (isSetOptions()) {
+      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.options, other.options);
+      if (lastComparison != 0) {
+        return lastComparison;
+      }
+    }
+    return 0;
+  }
+
+  public _Fields fieldForId(int fieldId) {
+    return _Fields.findByThriftId(fieldId);
+  }
+
+  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
+    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
+  }
+
+  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
+    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder("CompactionStrategyConfig(");
+    boolean first = true;
+
+    sb.append("className:");
+    if (this.className == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.className);
+    }
+    first = false;
+    if (!first) sb.append(", ");
+    sb.append("options:");
+    if (this.options == null) {
+      sb.append("null");
+    } else {
+      sb.append(this.options);
+    }
+    first = false;
+    sb.append(")");
+    return sb.toString();
+  }
+
+  public void validate() throws org.apache.thrift.TException {
+    // check for required fields
+    // check for sub-struct validity
+  }
+
+  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
+    try {
+      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
+    try {
+      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
+    } catch (org.apache.thrift.TException te) {
+      throw new java.io.IOException(te);
+    }
+  }
+
+  private static class CompactionStrategyConfigStandardSchemeFactory implements SchemeFactory {
+    public CompactionStrategyConfigStandardScheme getScheme() {
+      return new CompactionStrategyConfigStandardScheme();
+    }
+  }
+
+  private static class CompactionStrategyConfigStandardScheme extends StandardScheme<CompactionStrategyConfig> {
+
+    public void read(org.apache.thrift.protocol.TProtocol iprot, CompactionStrategyConfig struct) throws org.apache.thrift.TException {
+      org.apache.thrift.protocol.TField schemeField;
+      iprot.readStructBegin();
+      while (true)
+      {
+        schemeField = iprot.readFieldBegin();
+        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
+          break;
+        }
+        switch (schemeField.id) {
+          case 1: // CLASS_NAME
+            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
+              struct.className = iprot.readString();
+              struct.setClassNameIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          case 2: // OPTIONS
+            if (schemeField.type == org.apache.thrift.protocol.TType.MAP) {
+              {
+                org.apache.thrift.protocol.TMap _map154 = iprot.readMapBegin();
+                struct.options = new HashMap<String,String>(2*_map154.size);
+                for (int _i155 = 0; _i155 < _map154.size; ++_i155)
+                {
+                  String _key156;
+                  String _val157;
+                  _key156 = iprot.readString();
+                  _val157 = iprot.readString();
+                  struct.options.put(_key156, _val157);
+                }
+                iprot.readMapEnd();
+              }
+              struct.setOptionsIsSet(true);
+            } else { 
+              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+            }
+            break;
+          default:
+            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
+        }
+        iprot.readFieldEnd();
+      }
+      iprot.readStructEnd();
+
+      // check for required fields of primitive type, which can't be checked in the validate method
+      struct.validate();
+    }
+
+    public void write(org.apache.thrift.protocol.TProtocol oprot, CompactionStrategyConfig struct) throws org.apache.thrift.TException {
+      struct.validate();
+
+      oprot.writeStructBegin(STRUCT_DESC);
+      if (struct.className != null) {
+        oprot.writeFieldBegin(CLASS_NAME_FIELD_DESC);
+        oprot.writeString(struct.className);
+        oprot.writeFieldEnd();
+      }
+      if (struct.options != null) {
+        oprot.writeFieldBegin(OPTIONS_FIELD_DESC);
+        {
+          oprot.writeMapBegin(new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, struct.options.size()));
+          for (Map.Entry<String, String> _iter158 : struct.options.entrySet())
+          {
+            oprot.writeString(_iter158.getKey());
+            oprot.writeString(_iter158.getValue());
+          }
+          oprot.writeMapEnd();
+        }
+        oprot.writeFieldEnd();
+      }
+      oprot.writeFieldStop();
+      oprot.writeStructEnd();
+    }
+
+  }
+
+  private static class CompactionStrategyConfigTupleSchemeFactory implements SchemeFactory {
+    public CompactionStrategyConfigTupleScheme getScheme() {
+      return new CompactionStrategyConfigTupleScheme();
+    }
+  }
+
+  private static class CompactionStrategyConfigTupleScheme extends TupleScheme<CompactionStrategyConfig> {
+
+    @Override
+    public void write(org.apache.thrift.protocol.TProtocol prot, CompactionStrategyConfig struct) throws org.apache.thrift.TException {
+      TTupleProtocol oprot = (TTupleProtocol) prot;
+      BitSet optionals = new BitSet();
+      if (struct.isSetClassName()) {
+        optionals.set(0);
+      }
+      if (struct.isSetOptions()) {
+        optionals.set(1);
+      }
+      oprot.writeBitSet(optionals, 2);
+      if (struct.isSetClassName()) {
+        oprot.writeString(struct.className);
+      }
+      if (struct.isSetOptions()) {
+        {
+          oprot.writeI32(struct.options.size());
+          for (Map.Entry<String, String> _iter159 : struct.options.entrySet())
+          {
+            oprot.writeString(_iter159.getKey());
+            oprot.writeString(_iter159.getValue());
+          }
+        }
+      }
+    }
+
+    @Override
+    public void read(org.apache.thrift.protocol.TProtocol prot, CompactionStrategyConfig struct) throws org.apache.thrift.TException {
+      TTupleProtocol iprot = (TTupleProtocol) prot;
+      BitSet incoming = iprot.readBitSet(2);
+      if (incoming.get(0)) {
+        struct.className = iprot.readString();
+        struct.setClassNameIsSet(true);
+      }
+      if (incoming.get(1)) {
+        {
+          org.apache.thrift.protocol.TMap _map160 = new org.apache.thrift.protocol.TMap(org.apache.thrift.protocol.TType.STRING, org.apache.thrift.protocol.TType.STRING, iprot.readI32());
+          struct.options = new HashMap<String,String>(2*_map160.size);
+          for (int _i161 = 0; _i161 < _map160.size; ++_i161)
+          {
+            String _key162;
+            String _val163;
+            _key162 = iprot.readString();
+            _val163 = iprot.readString();
+            struct.options.put(_key162, _val163);
+          }
+        }
+        struct.setOptionsIsSet(true);
+      }
+    }
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/python/AccumuloProxy-remote
----------------------------------------------------------------------
diff --git a/proxy/src/main/python/AccumuloProxy-remote b/proxy/src/main/python/AccumuloProxy-remote
index b4292a2..a8d7542 100644
--- a/proxy/src/main/python/AccumuloProxy-remote
+++ b/proxy/src/main/python/AccumuloProxy-remote
@@ -44,7 +44,7 @@ if len(sys.argv) <= 1 or sys.argv[1] == '--help':
   print '  void checkIteratorConflicts(string login, string tableName, IteratorSetting setting,  scopes)'
   print '  void clearLocatorCache(string login, string tableName)'
   print '  void cloneTable(string login, string tableName, string newTableName, bool flush,  propertiesToSet,  propertiesToExclude)'
-  print '  void compactTable(string login, string tableName, string startRow, string endRow,  iterators, bool flush, bool wait)'
+  print '  void compactTable(string login, string tableName, string startRow, string endRow,  iterators, bool flush, bool wait, CompactionStrategyConfig compactionStrategy)'
   print '  void cancelCompaction(string login, string tableName)'
   print '  void createTable(string login, string tableName, bool versioningIter, TimeType type)'
   print '  void deleteTable(string login, string tableName)'
@@ -208,10 +208,10 @@ elif cmd == 'cloneTable':
   pp.pprint(client.cloneTable(args[0],args[1],args[2],eval(args[3]),eval(args[4]),eval(args[5]),))
 
 elif cmd == 'compactTable':
-  if len(args) != 7:
-    print 'compactTable requires 7 args'
+  if len(args) != 8:
+    print 'compactTable requires 8 args'
     sys.exit(1)
-  pp.pprint(client.compactTable(args[0],args[1],args[2],args[3],eval(args[4]),eval(args[5]),eval(args[6]),))
+  pp.pprint(client.compactTable(args[0],args[1],args[2],args[3],eval(args[4]),eval(args[5]),eval(args[6]),eval(args[7]),))
 
 elif cmd == 'cancelCompaction':
   if len(args) != 2:

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/python/AccumuloProxy.py
----------------------------------------------------------------------
diff --git a/proxy/src/main/python/AccumuloProxy.py b/proxy/src/main/python/AccumuloProxy.py
index 37dda0f..2805fff 100644
--- a/proxy/src/main/python/AccumuloProxy.py
+++ b/proxy/src/main/python/AccumuloProxy.py
@@ -98,7 +98,7 @@ class Iface:
     """
     pass
 
-  def compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait):
+  def compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy):
     """
     Parameters:
      - login
@@ -108,6 +108,7 @@ class Iface:
      - iterators
      - flush
      - wait
+     - compactionStrategy
     """
     pass
 
@@ -986,7 +987,7 @@ class Client(Iface):
       raise result.ouch4
     return
 
-  def compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait):
+  def compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy):
     """
     Parameters:
      - login
@@ -996,11 +997,12 @@ class Client(Iface):
      - iterators
      - flush
      - wait
+     - compactionStrategy
     """
-    self.send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait)
+    self.send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy)
     self.recv_compactTable()
 
-  def send_compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait):
+  def send_compactTable(self, login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy):
     self._oprot.writeMessageBegin('compactTable', TMessageType.CALL, self._seqid)
     args = compactTable_args()
     args.login = login
@@ -1010,6 +1012,7 @@ class Client(Iface):
     args.iterators = iterators
     args.flush = flush
     args.wait = wait
+    args.compactionStrategy = compactionStrategy
     args.write(self._oprot)
     self._oprot.writeMessageEnd()
     self._oprot.trans.flush()
@@ -3796,7 +3799,7 @@ class Processor(Iface, TProcessor):
     iprot.readMessageEnd()
     result = compactTable_result()
     try:
-      self._handler.compactTable(args.login, args.tableName, args.startRow, args.endRow, args.iterators, args.flush, args.wait)
+      self._handler.compactTable(args.login, args.tableName, args.startRow, args.endRow, args.iterators, args.flush, args.wait, args.compactionStrategy)
     except AccumuloSecurityException, ouch1:
       result.ouch1 = ouch1
     except TableNotFoundException, ouch2:
@@ -4985,11 +4988,11 @@ class login_args:
       elif fid == 2:
         if ftype == TType.MAP:
           self.loginProperties = {}
-          (_ktype136, _vtype137, _size135 ) = iprot.readMapBegin()
-          for _i139 in xrange(_size135):
-            _key140 = iprot.readString();
-            _val141 = iprot.readString();
-            self.loginProperties[_key140] = _val141
+          (_ktype145, _vtype146, _size144 ) = iprot.readMapBegin()
+          for _i148 in xrange(_size144):
+            _key149 = iprot.readString();
+            _val150 = iprot.readString();
+            self.loginProperties[_key149] = _val150
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -5010,9 +5013,9 @@ class login_args:
     if self.loginProperties is not None:
       oprot.writeFieldBegin('loginProperties', TType.MAP, 2)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.loginProperties))
-      for kiter142,viter143 in self.loginProperties.items():
-        oprot.writeString(kiter142)
-        oprot.writeString(viter143)
+      for kiter151,viter152 in self.loginProperties.items():
+        oprot.writeString(kiter151)
+        oprot.writeString(viter152)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -5329,10 +5332,10 @@ class addSplits_args:
       elif fid == 3:
         if ftype == TType.SET:
           self.splits = set()
-          (_etype147, _size144) = iprot.readSetBegin()
-          for _i148 in xrange(_size144):
-            _elem149 = iprot.readString();
-            self.splits.add(_elem149)
+          (_etype156, _size153) = iprot.readSetBegin()
+          for _i157 in xrange(_size153):
+            _elem158 = iprot.readString();
+            self.splits.add(_elem158)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -5357,8 +5360,8 @@ class addSplits_args:
     if self.splits is not None:
       oprot.writeFieldBegin('splits', TType.SET, 3)
       oprot.writeSetBegin(TType.STRING, len(self.splits))
-      for iter150 in self.splits:
-        oprot.writeString(iter150)
+      for iter159 in self.splits:
+        oprot.writeString(iter159)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -5517,10 +5520,10 @@ class attachIterator_args:
       elif fid == 4:
         if ftype == TType.SET:
           self.scopes = set()
-          (_etype154, _size151) = iprot.readSetBegin()
-          for _i155 in xrange(_size151):
-            _elem156 = iprot.readI32();
-            self.scopes.add(_elem156)
+          (_etype163, _size160) = iprot.readSetBegin()
+          for _i164 in xrange(_size160):
+            _elem165 = iprot.readI32();
+            self.scopes.add(_elem165)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -5549,8 +5552,8 @@ class attachIterator_args:
     if self.scopes is not None:
       oprot.writeFieldBegin('scopes', TType.SET, 4)
       oprot.writeSetBegin(TType.I32, len(self.scopes))
-      for iter157 in self.scopes:
-        oprot.writeI32(iter157)
+      for iter166 in self.scopes:
+        oprot.writeI32(iter166)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -5709,10 +5712,10 @@ class checkIteratorConflicts_args:
       elif fid == 4:
         if ftype == TType.SET:
           self.scopes = set()
-          (_etype161, _size158) = iprot.readSetBegin()
-          for _i162 in xrange(_size158):
-            _elem163 = iprot.readI32();
-            self.scopes.add(_elem163)
+          (_etype170, _size167) = iprot.readSetBegin()
+          for _i171 in xrange(_size167):
+            _elem172 = iprot.readI32();
+            self.scopes.add(_elem172)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -5741,8 +5744,8 @@ class checkIteratorConflicts_args:
     if self.scopes is not None:
       oprot.writeFieldBegin('scopes', TType.SET, 4)
       oprot.writeSetBegin(TType.I32, len(self.scopes))
-      for iter164 in self.scopes:
-        oprot.writeI32(iter164)
+      for iter173 in self.scopes:
+        oprot.writeI32(iter173)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -6044,21 +6047,21 @@ class cloneTable_args:
       elif fid == 5:
         if ftype == TType.MAP:
           self.propertiesToSet = {}
-          (_ktype166, _vtype167, _size165 ) = iprot.readMapBegin()
-          for _i169 in xrange(_size165):
-            _key170 = iprot.readString();
-            _val171 = iprot.readString();
-            self.propertiesToSet[_key170] = _val171
+          (_ktype175, _vtype176, _size174 ) = iprot.readMapBegin()
+          for _i178 in xrange(_size174):
+            _key179 = iprot.readString();
+            _val180 = iprot.readString();
+            self.propertiesToSet[_key179] = _val180
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
       elif fid == 6:
         if ftype == TType.SET:
           self.propertiesToExclude = set()
-          (_etype175, _size172) = iprot.readSetBegin()
-          for _i176 in xrange(_size172):
-            _elem177 = iprot.readString();
-            self.propertiesToExclude.add(_elem177)
+          (_etype184, _size181) = iprot.readSetBegin()
+          for _i185 in xrange(_size181):
+            _elem186 = iprot.readString();
+            self.propertiesToExclude.add(_elem186)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -6091,16 +6094,16 @@ class cloneTable_args:
     if self.propertiesToSet is not None:
       oprot.writeFieldBegin('propertiesToSet', TType.MAP, 5)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.propertiesToSet))
-      for kiter178,viter179 in self.propertiesToSet.items():
-        oprot.writeString(kiter178)
-        oprot.writeString(viter179)
+      for kiter187,viter188 in self.propertiesToSet.items():
+        oprot.writeString(kiter187)
+        oprot.writeString(viter188)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.propertiesToExclude is not None:
       oprot.writeFieldBegin('propertiesToExclude', TType.SET, 6)
       oprot.writeSetBegin(TType.STRING, len(self.propertiesToExclude))
-      for iter180 in self.propertiesToExclude:
-        oprot.writeString(iter180)
+      for iter189 in self.propertiesToExclude:
+        oprot.writeString(iter189)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -6231,6 +6234,7 @@ class compactTable_args:
    - iterators
    - flush
    - wait
+   - compactionStrategy
   """
 
   thrift_spec = (
@@ -6242,9 +6246,10 @@ class compactTable_args:
     (5, TType.LIST, 'iterators', (TType.STRUCT,(IteratorSetting, IteratorSetting.thrift_spec)), None, ), # 5
     (6, TType.BOOL, 'flush', None, None, ), # 6
     (7, TType.BOOL, 'wait', None, None, ), # 7
+    (8, TType.STRUCT, 'compactionStrategy', (CompactionStrategyConfig, CompactionStrategyConfig.thrift_spec), None, ), # 8
   )
 
-  def __init__(self, login=None, tableName=None, startRow=None, endRow=None, iterators=None, flush=None, wait=None,):
+  def __init__(self, login=None, tableName=None, startRow=None, endRow=None, iterators=None, flush=None, wait=None, compactionStrategy=None,):
     self.login = login
     self.tableName = tableName
     self.startRow = startRow
@@ -6252,6 +6257,7 @@ class compactTable_args:
     self.iterators = iterators
     self.flush = flush
     self.wait = wait
+    self.compactionStrategy = compactionStrategy
 
   def read(self, iprot):
     if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
@@ -6285,11 +6291,11 @@ class compactTable_args:
       elif fid == 5:
         if ftype == TType.LIST:
           self.iterators = []
-          (_etype184, _size181) = iprot.readListBegin()
-          for _i185 in xrange(_size181):
-            _elem186 = IteratorSetting()
-            _elem186.read(iprot)
-            self.iterators.append(_elem186)
+          (_etype193, _size190) = iprot.readListBegin()
+          for _i194 in xrange(_size190):
+            _elem195 = IteratorSetting()
+            _elem195.read(iprot)
+            self.iterators.append(_elem195)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -6303,6 +6309,12 @@ class compactTable_args:
           self.wait = iprot.readBool();
         else:
           iprot.skip(ftype)
+      elif fid == 8:
+        if ftype == TType.STRUCT:
+          self.compactionStrategy = CompactionStrategyConfig()
+          self.compactionStrategy.read(iprot)
+        else:
+          iprot.skip(ftype)
       else:
         iprot.skip(ftype)
       iprot.readFieldEnd()
@@ -6332,8 +6344,8 @@ class compactTable_args:
     if self.iterators is not None:
       oprot.writeFieldBegin('iterators', TType.LIST, 5)
       oprot.writeListBegin(TType.STRUCT, len(self.iterators))
-      for iter187 in self.iterators:
-        iter187.write(oprot)
+      for iter196 in self.iterators:
+        iter196.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.flush is not None:
@@ -6344,6 +6356,10 @@ class compactTable_args:
       oprot.writeFieldBegin('wait', TType.BOOL, 7)
       oprot.writeBool(self.wait)
       oprot.writeFieldEnd()
+    if self.compactionStrategy is not None:
+      oprot.writeFieldBegin('compactionStrategy', TType.STRUCT, 8)
+      self.compactionStrategy.write(oprot)
+      oprot.writeFieldEnd()
     oprot.writeFieldStop()
     oprot.writeStructEnd()
 
@@ -7533,10 +7549,10 @@ class getDiskUsage_args:
       elif fid == 2:
         if ftype == TType.SET:
           self.tables = set()
-          (_etype191, _size188) = iprot.readSetBegin()
-          for _i192 in xrange(_size188):
-            _elem193 = iprot.readString();
-            self.tables.add(_elem193)
+          (_etype200, _size197) = iprot.readSetBegin()
+          for _i201 in xrange(_size197):
+            _elem202 = iprot.readString();
+            self.tables.add(_elem202)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -7557,8 +7573,8 @@ class getDiskUsage_args:
     if self.tables is not None:
       oprot.writeFieldBegin('tables', TType.SET, 2)
       oprot.writeSetBegin(TType.STRING, len(self.tables))
-      for iter194 in self.tables:
-        oprot.writeString(iter194)
+      for iter203 in self.tables:
+        oprot.writeString(iter203)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -7613,11 +7629,11 @@ class getDiskUsage_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype198, _size195) = iprot.readListBegin()
-          for _i199 in xrange(_size195):
-            _elem200 = DiskUsage()
-            _elem200.read(iprot)
-            self.success.append(_elem200)
+          (_etype207, _size204) = iprot.readListBegin()
+          for _i208 in xrange(_size204):
+            _elem209 = DiskUsage()
+            _elem209.read(iprot)
+            self.success.append(_elem209)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -7652,8 +7668,8 @@ class getDiskUsage_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter201 in self.success:
-        iter201.write(oprot)
+      for iter210 in self.success:
+        iter210.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -7792,16 +7808,16 @@ class getLocalityGroups_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype203, _vtype204, _size202 ) = iprot.readMapBegin()
-          for _i206 in xrange(_size202):
-            _key207 = iprot.readString();
-            _val208 = set()
-            (_etype212, _size209) = iprot.readSetBegin()
-            for _i213 in xrange(_size209):
-              _elem214 = iprot.readString();
-              _val208.add(_elem214)
+          (_ktype212, _vtype213, _size211 ) = iprot.readMapBegin()
+          for _i215 in xrange(_size211):
+            _key216 = iprot.readString();
+            _val217 = set()
+            (_etype221, _size218) = iprot.readSetBegin()
+            for _i222 in xrange(_size218):
+              _elem223 = iprot.readString();
+              _val217.add(_elem223)
             iprot.readSetEnd()
-            self.success[_key207] = _val208
+            self.success[_key216] = _val217
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -7836,11 +7852,11 @@ class getLocalityGroups_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.SET, len(self.success))
-      for kiter215,viter216 in self.success.items():
-        oprot.writeString(kiter215)
-        oprot.writeSetBegin(TType.STRING, len(viter216))
-        for iter217 in viter216:
-          oprot.writeString(iter217)
+      for kiter224,viter225 in self.success.items():
+        oprot.writeString(kiter224)
+        oprot.writeSetBegin(TType.STRING, len(viter225))
+        for iter226 in viter225:
+          oprot.writeString(iter226)
         oprot.writeSetEnd()
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
@@ -8123,10 +8139,10 @@ class getMaxRow_args:
       elif fid == 3:
         if ftype == TType.SET:
           self.auths = set()
-          (_etype221, _size218) = iprot.readSetBegin()
-          for _i222 in xrange(_size218):
-            _elem223 = iprot.readString();
-            self.auths.add(_elem223)
+          (_etype230, _size227) = iprot.readSetBegin()
+          for _i231 in xrange(_size227):
+            _elem232 = iprot.readString();
+            self.auths.add(_elem232)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -8171,8 +8187,8 @@ class getMaxRow_args:
     if self.auths is not None:
       oprot.writeFieldBegin('auths', TType.SET, 3)
       oprot.writeSetBegin(TType.STRING, len(self.auths))
-      for iter224 in self.auths:
-        oprot.writeString(iter224)
+      for iter233 in self.auths:
+        oprot.writeString(iter233)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     if self.startRow is not None:
@@ -8413,11 +8429,11 @@ class getTableProperties_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype226, _vtype227, _size225 ) = iprot.readMapBegin()
-          for _i229 in xrange(_size225):
-            _key230 = iprot.readString();
-            _val231 = iprot.readString();
-            self.success[_key230] = _val231
+          (_ktype235, _vtype236, _size234 ) = iprot.readMapBegin()
+          for _i238 in xrange(_size234):
+            _key239 = iprot.readString();
+            _val240 = iprot.readString();
+            self.success[_key239] = _val240
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -8452,9 +8468,9 @@ class getTableProperties_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter232,viter233 in self.success.items():
-        oprot.writeString(kiter232)
-        oprot.writeString(viter233)
+      for kiter241,viter242 in self.success.items():
+        oprot.writeString(kiter241)
+        oprot.writeString(viter242)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -8971,10 +8987,10 @@ class listSplits_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype237, _size234) = iprot.readListBegin()
-          for _i238 in xrange(_size234):
-            _elem239 = iprot.readString();
-            self.success.append(_elem239)
+          (_etype246, _size243) = iprot.readListBegin()
+          for _i247 in xrange(_size243):
+            _elem248 = iprot.readString();
+            self.success.append(_elem248)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -9009,8 +9025,8 @@ class listSplits_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter240 in self.success:
-        oprot.writeString(iter240)
+      for iter249 in self.success:
+        oprot.writeString(iter249)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -9128,10 +9144,10 @@ class listTables_result:
       if fid == 0:
         if ftype == TType.SET:
           self.success = set()
-          (_etype244, _size241) = iprot.readSetBegin()
-          for _i245 in xrange(_size241):
-            _elem246 = iprot.readString();
-            self.success.add(_elem246)
+          (_etype253, _size250) = iprot.readSetBegin()
+          for _i254 in xrange(_size250):
+            _elem255 = iprot.readString();
+            self.success.add(_elem255)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -9148,8 +9164,8 @@ class listTables_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.SET, 0)
       oprot.writeSetBegin(TType.STRING, len(self.success))
-      for iter247 in self.success:
-        oprot.writeString(iter247)
+      for iter256 in self.success:
+        oprot.writeString(iter256)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -9276,16 +9292,16 @@ class listIterators_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype249, _vtype250, _size248 ) = iprot.readMapBegin()
-          for _i252 in xrange(_size248):
-            _key253 = iprot.readString();
-            _val254 = set()
-            (_etype258, _size255) = iprot.readSetBegin()
-            for _i259 in xrange(_size255):
-              _elem260 = iprot.readI32();
-              _val254.add(_elem260)
+          (_ktype258, _vtype259, _size257 ) = iprot.readMapBegin()
+          for _i261 in xrange(_size257):
+            _key262 = iprot.readString();
+            _val263 = set()
+            (_etype267, _size264) = iprot.readSetBegin()
+            for _i268 in xrange(_size264):
+              _elem269 = iprot.readI32();
+              _val263.add(_elem269)
             iprot.readSetEnd()
-            self.success[_key253] = _val254
+            self.success[_key262] = _val263
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -9320,11 +9336,11 @@ class listIterators_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.SET, len(self.success))
-      for kiter261,viter262 in self.success.items():
-        oprot.writeString(kiter261)
-        oprot.writeSetBegin(TType.I32, len(viter262))
-        for iter263 in viter262:
-          oprot.writeI32(iter263)
+      for kiter270,viter271 in self.success.items():
+        oprot.writeString(kiter270)
+        oprot.writeSetBegin(TType.I32, len(viter271))
+        for iter272 in viter271:
+          oprot.writeI32(iter272)
         oprot.writeSetEnd()
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
@@ -9464,11 +9480,11 @@ class listConstraints_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype265, _vtype266, _size264 ) = iprot.readMapBegin()
-          for _i268 in xrange(_size264):
-            _key269 = iprot.readString();
-            _val270 = iprot.readI32();
-            self.success[_key269] = _val270
+          (_ktype274, _vtype275, _size273 ) = iprot.readMapBegin()
+          for _i277 in xrange(_size273):
+            _key278 = iprot.readString();
+            _val279 = iprot.readI32();
+            self.success[_key278] = _val279
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -9503,9 +9519,9 @@ class listConstraints_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.I32, len(self.success))
-      for kiter271,viter272 in self.success.items():
-        oprot.writeString(kiter271)
-        oprot.writeI32(viter272)
+      for kiter280,viter281 in self.success.items():
+        oprot.writeString(kiter280)
+        oprot.writeI32(viter281)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -10284,10 +10300,10 @@ class removeIterator_args:
       elif fid == 4:
         if ftype == TType.SET:
           self.scopes = set()
-          (_etype276, _size273) = iprot.readSetBegin()
-          for _i277 in xrange(_size273):
-            _elem278 = iprot.readI32();
-            self.scopes.add(_elem278)
+          (_etype285, _size282) = iprot.readSetBegin()
+          for _i286 in xrange(_size282):
+            _elem287 = iprot.readI32();
+            self.scopes.add(_elem287)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -10316,8 +10332,8 @@ class removeIterator_args:
     if self.scopes is not None:
       oprot.writeFieldBegin('scopes', TType.SET, 4)
       oprot.writeSetBegin(TType.I32, len(self.scopes))
-      for iter279 in self.scopes:
-        oprot.writeI32(iter279)
+      for iter288 in self.scopes:
+        oprot.writeI32(iter288)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -10822,16 +10838,16 @@ class setLocalityGroups_args:
       elif fid == 3:
         if ftype == TType.MAP:
           self.groups = {}
-          (_ktype281, _vtype282, _size280 ) = iprot.readMapBegin()
-          for _i284 in xrange(_size280):
-            _key285 = iprot.readString();
-            _val286 = set()
-            (_etype290, _size287) = iprot.readSetBegin()
-            for _i291 in xrange(_size287):
-              _elem292 = iprot.readString();
-              _val286.add(_elem292)
+          (_ktype290, _vtype291, _size289 ) = iprot.readMapBegin()
+          for _i293 in xrange(_size289):
+            _key294 = iprot.readString();
+            _val295 = set()
+            (_etype299, _size296) = iprot.readSetBegin()
+            for _i300 in xrange(_size296):
+              _elem301 = iprot.readString();
+              _val295.add(_elem301)
             iprot.readSetEnd()
-            self.groups[_key285] = _val286
+            self.groups[_key294] = _val295
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -10856,11 +10872,11 @@ class setLocalityGroups_args:
     if self.groups is not None:
       oprot.writeFieldBegin('groups', TType.MAP, 3)
       oprot.writeMapBegin(TType.STRING, TType.SET, len(self.groups))
-      for kiter293,viter294 in self.groups.items():
-        oprot.writeString(kiter293)
-        oprot.writeSetBegin(TType.STRING, len(viter294))
-        for iter295 in viter294:
-          oprot.writeString(iter295)
+      for kiter302,viter303 in self.groups.items():
+        oprot.writeString(kiter302)
+        oprot.writeSetBegin(TType.STRING, len(viter303))
+        for iter304 in viter303:
+          oprot.writeString(iter304)
         oprot.writeSetEnd()
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
@@ -11283,11 +11299,11 @@ class splitRangeByTablets_result:
       if fid == 0:
         if ftype == TType.SET:
           self.success = set()
-          (_etype299, _size296) = iprot.readSetBegin()
-          for _i300 in xrange(_size296):
-            _elem301 = Range()
-            _elem301.read(iprot)
-            self.success.add(_elem301)
+          (_etype308, _size305) = iprot.readSetBegin()
+          for _i309 in xrange(_size305):
+            _elem310 = Range()
+            _elem310.read(iprot)
+            self.success.add(_elem310)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -11322,8 +11338,8 @@ class splitRangeByTablets_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.SET, 0)
       oprot.writeSetBegin(TType.STRUCT, len(self.success))
-      for iter302 in self.success:
-        iter302.write(oprot)
+      for iter311 in self.success:
+        iter311.write(oprot)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -11572,11 +11588,11 @@ class tableIdMap_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype304, _vtype305, _size303 ) = iprot.readMapBegin()
-          for _i307 in xrange(_size303):
-            _key308 = iprot.readString();
-            _val309 = iprot.readString();
-            self.success[_key308] = _val309
+          (_ktype313, _vtype314, _size312 ) = iprot.readMapBegin()
+          for _i316 in xrange(_size312):
+            _key317 = iprot.readString();
+            _val318 = iprot.readString();
+            self.success[_key317] = _val318
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -11593,9 +11609,9 @@ class tableIdMap_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter310,viter311 in self.success.items():
-        oprot.writeString(kiter310)
-        oprot.writeString(viter311)
+      for kiter319,viter320 in self.success.items():
+        oprot.writeString(kiter319)
+        oprot.writeString(viter320)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -12059,11 +12075,11 @@ class getActiveScans_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype315, _size312) = iprot.readListBegin()
-          for _i316 in xrange(_size312):
-            _elem317 = ActiveScan()
-            _elem317.read(iprot)
-            self.success.append(_elem317)
+          (_etype324, _size321) = iprot.readListBegin()
+          for _i325 in xrange(_size321):
+            _elem326 = ActiveScan()
+            _elem326.read(iprot)
+            self.success.append(_elem326)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12092,8 +12108,8 @@ class getActiveScans_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter318 in self.success:
-        iter318.write(oprot)
+      for iter327 in self.success:
+        iter327.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -12225,11 +12241,11 @@ class getActiveCompactions_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype322, _size319) = iprot.readListBegin()
-          for _i323 in xrange(_size319):
-            _elem324 = ActiveCompaction()
-            _elem324.read(iprot)
-            self.success.append(_elem324)
+          (_etype331, _size328) = iprot.readListBegin()
+          for _i332 in xrange(_size328):
+            _elem333 = ActiveCompaction()
+            _elem333.read(iprot)
+            self.success.append(_elem333)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12258,8 +12274,8 @@ class getActiveCompactions_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRUCT, len(self.success))
-      for iter325 in self.success:
-        iter325.write(oprot)
+      for iter334 in self.success:
+        iter334.write(oprot)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -12379,11 +12395,11 @@ class getSiteConfiguration_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype327, _vtype328, _size326 ) = iprot.readMapBegin()
-          for _i330 in xrange(_size326):
-            _key331 = iprot.readString();
-            _val332 = iprot.readString();
-            self.success[_key331] = _val332
+          (_ktype336, _vtype337, _size335 ) = iprot.readMapBegin()
+          for _i339 in xrange(_size335):
+            _key340 = iprot.readString();
+            _val341 = iprot.readString();
+            self.success[_key340] = _val341
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -12412,9 +12428,9 @@ class getSiteConfiguration_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter333,viter334 in self.success.items():
-        oprot.writeString(kiter333)
-        oprot.writeString(viter334)
+      for kiter342,viter343 in self.success.items():
+        oprot.writeString(kiter342)
+        oprot.writeString(viter343)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -12534,11 +12550,11 @@ class getSystemConfiguration_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype336, _vtype337, _size335 ) = iprot.readMapBegin()
-          for _i339 in xrange(_size335):
-            _key340 = iprot.readString();
-            _val341 = iprot.readString();
-            self.success[_key340] = _val341
+          (_ktype345, _vtype346, _size344 ) = iprot.readMapBegin()
+          for _i348 in xrange(_size344):
+            _key349 = iprot.readString();
+            _val350 = iprot.readString();
+            self.success[_key349] = _val350
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -12567,9 +12583,9 @@ class getSystemConfiguration_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.success))
-      for kiter342,viter343 in self.success.items():
-        oprot.writeString(kiter342)
-        oprot.writeString(viter343)
+      for kiter351,viter352 in self.success.items():
+        oprot.writeString(kiter351)
+        oprot.writeString(viter352)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -12683,10 +12699,10 @@ class getTabletServers_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype347, _size344) = iprot.readListBegin()
-          for _i348 in xrange(_size344):
-            _elem349 = iprot.readString();
-            self.success.append(_elem349)
+          (_etype356, _size353) = iprot.readListBegin()
+          for _i357 in xrange(_size353):
+            _elem358 = iprot.readString();
+            self.success.append(_elem358)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -12703,8 +12719,8 @@ class getTabletServers_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter350 in self.success:
-        oprot.writeString(iter350)
+      for iter359 in self.success:
+        oprot.writeString(iter359)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -13240,11 +13256,11 @@ class authenticateUser_args:
       elif fid == 3:
         if ftype == TType.MAP:
           self.properties = {}
-          (_ktype352, _vtype353, _size351 ) = iprot.readMapBegin()
-          for _i355 in xrange(_size351):
-            _key356 = iprot.readString();
-            _val357 = iprot.readString();
-            self.properties[_key356] = _val357
+          (_ktype361, _vtype362, _size360 ) = iprot.readMapBegin()
+          for _i364 in xrange(_size360):
+            _key365 = iprot.readString();
+            _val366 = iprot.readString();
+            self.properties[_key365] = _val366
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -13269,9 +13285,9 @@ class authenticateUser_args:
     if self.properties is not None:
       oprot.writeFieldBegin('properties', TType.MAP, 3)
       oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.properties))
-      for kiter358,viter359 in self.properties.items():
-        oprot.writeString(kiter358)
-        oprot.writeString(viter359)
+      for kiter367,viter368 in self.properties.items():
+        oprot.writeString(kiter367)
+        oprot.writeString(viter368)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -13419,10 +13435,10 @@ class changeUserAuthorizations_args:
       elif fid == 3:
         if ftype == TType.SET:
           self.authorizations = set()
-          (_etype363, _size360) = iprot.readSetBegin()
-          for _i364 in xrange(_size360):
-            _elem365 = iprot.readString();
-            self.authorizations.add(_elem365)
+          (_etype372, _size369) = iprot.readSetBegin()
+          for _i373 in xrange(_size369):
+            _elem374 = iprot.readString();
+            self.authorizations.add(_elem374)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -13447,8 +13463,8 @@ class changeUserAuthorizations_args:
     if self.authorizations is not None:
       oprot.writeFieldBegin('authorizations', TType.SET, 3)
       oprot.writeSetBegin(TType.STRING, len(self.authorizations))
-      for iter366 in self.authorizations:
-        oprot.writeString(iter366)
+      for iter375 in self.authorizations:
+        oprot.writeString(iter375)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -14108,10 +14124,10 @@ class getUserAuthorizations_result:
       if fid == 0:
         if ftype == TType.LIST:
           self.success = []
-          (_etype370, _size367) = iprot.readListBegin()
-          for _i371 in xrange(_size367):
-            _elem372 = iprot.readString();
-            self.success.append(_elem372)
+          (_etype379, _size376) = iprot.readListBegin()
+          for _i380 in xrange(_size376):
+            _elem381 = iprot.readString();
+            self.success.append(_elem381)
           iprot.readListEnd()
         else:
           iprot.skip(ftype)
@@ -14140,8 +14156,8 @@ class getUserAuthorizations_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.LIST, 0)
       oprot.writeListBegin(TType.STRING, len(self.success))
-      for iter373 in self.success:
-        oprot.writeString(iter373)
+      for iter382 in self.success:
+        oprot.writeString(iter382)
       oprot.writeListEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -14968,10 +14984,10 @@ class listLocalUsers_result:
       if fid == 0:
         if ftype == TType.SET:
           self.success = set()
-          (_etype377, _size374) = iprot.readSetBegin()
-          for _i378 in xrange(_size374):
-            _elem379 = iprot.readString();
-            self.success.add(_elem379)
+          (_etype386, _size383) = iprot.readSetBegin()
+          for _i387 in xrange(_size383):
+            _elem388 = iprot.readString();
+            self.success.add(_elem388)
           iprot.readSetEnd()
         else:
           iprot.skip(ftype)
@@ -15006,8 +15022,8 @@ class listLocalUsers_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.SET, 0)
       oprot.writeSetBegin(TType.STRING, len(self.success))
-      for iter380 in self.success:
-        oprot.writeString(iter380)
+      for iter389 in self.success:
+        oprot.writeString(iter389)
       oprot.writeSetEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:
@@ -16372,17 +16388,17 @@ class updateAndFlush_args:
       elif fid == 3:
         if ftype == TType.MAP:
           self.cells = {}
-          (_ktype382, _vtype383, _size381 ) = iprot.readMapBegin()
-          for _i385 in xrange(_size381):
-            _key386 = iprot.readString();
-            _val387 = []
-            (_etype391, _size388) = iprot.readListBegin()
-            for _i392 in xrange(_size388):
-              _elem393 = ColumnUpdate()
-              _elem393.read(iprot)
-              _val387.append(_elem393)
+          (_ktype391, _vtype392, _size390 ) = iprot.readMapBegin()
+          for _i394 in xrange(_size390):
+            _key395 = iprot.readString();
+            _val396 = []
+            (_etype400, _size397) = iprot.readListBegin()
+            for _i401 in xrange(_size397):
+              _elem402 = ColumnUpdate()
+              _elem402.read(iprot)
+              _val396.append(_elem402)
             iprot.readListEnd()
-            self.cells[_key386] = _val387
+            self.cells[_key395] = _val396
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -16407,11 +16423,11 @@ class updateAndFlush_args:
     if self.cells is not None:
       oprot.writeFieldBegin('cells', TType.MAP, 3)
       oprot.writeMapBegin(TType.STRING, TType.LIST, len(self.cells))
-      for kiter394,viter395 in self.cells.items():
-        oprot.writeString(kiter394)
-        oprot.writeListBegin(TType.STRUCT, len(viter395))
-        for iter396 in viter395:
-          iter396.write(oprot)
+      for kiter403,viter404 in self.cells.items():
+        oprot.writeString(kiter403)
+        oprot.writeListBegin(TType.STRUCT, len(viter404))
+        for iter405 in viter404:
+          iter405.write(oprot)
         oprot.writeListEnd()
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
@@ -16750,17 +16766,17 @@ class update_args:
       elif fid == 2:
         if ftype == TType.MAP:
           self.cells = {}
-          (_ktype398, _vtype399, _size397 ) = iprot.readMapBegin()
-          for _i401 in xrange(_size397):
-            _key402 = iprot.readString();
-            _val403 = []
-            (_etype407, _size404) = iprot.readListBegin()
-            for _i408 in xrange(_size404):
-              _elem409 = ColumnUpdate()
-              _elem409.read(iprot)
-              _val403.append(_elem409)
+          (_ktype407, _vtype408, _size406 ) = iprot.readMapBegin()
+          for _i410 in xrange(_size406):
+            _key411 = iprot.readString();
+            _val412 = []
+            (_etype416, _size413) = iprot.readListBegin()
+            for _i417 in xrange(_size413):
+              _elem418 = ColumnUpdate()
+              _elem418.read(iprot)
+              _val412.append(_elem418)
             iprot.readListEnd()
-            self.cells[_key402] = _val403
+            self.cells[_key411] = _val412
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -16781,11 +16797,11 @@ class update_args:
     if self.cells is not None:
       oprot.writeFieldBegin('cells', TType.MAP, 2)
       oprot.writeMapBegin(TType.STRING, TType.LIST, len(self.cells))
-      for kiter410,viter411 in self.cells.items():
-        oprot.writeString(kiter410)
-        oprot.writeListBegin(TType.STRUCT, len(viter411))
-        for iter412 in viter411:
-          iter412.write(oprot)
+      for kiter419,viter420 in self.cells.items():
+        oprot.writeString(kiter419)
+        oprot.writeListBegin(TType.STRUCT, len(viter420))
+        for iter421 in viter420:
+          iter421.write(oprot)
         oprot.writeListEnd()
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
@@ -17487,12 +17503,12 @@ class updateRowsConditionally_args:
       elif fid == 2:
         if ftype == TType.MAP:
           self.updates = {}
-          (_ktype414, _vtype415, _size413 ) = iprot.readMapBegin()
-          for _i417 in xrange(_size413):
-            _key418 = iprot.readString();
-            _val419 = ConditionalUpdates()
-            _val419.read(iprot)
-            self.updates[_key418] = _val419
+          (_ktype423, _vtype424, _size422 ) = iprot.readMapBegin()
+          for _i426 in xrange(_size422):
+            _key427 = iprot.readString();
+            _val428 = ConditionalUpdates()
+            _val428.read(iprot)
+            self.updates[_key427] = _val428
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -17513,9 +17529,9 @@ class updateRowsConditionally_args:
     if self.updates is not None:
       oprot.writeFieldBegin('updates', TType.MAP, 2)
       oprot.writeMapBegin(TType.STRING, TType.STRUCT, len(self.updates))
-      for kiter420,viter421 in self.updates.items():
-        oprot.writeString(kiter420)
-        viter421.write(oprot)
+      for kiter429,viter430 in self.updates.items():
+        oprot.writeString(kiter429)
+        viter430.write(oprot)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     oprot.writeFieldStop()
@@ -17570,11 +17586,11 @@ class updateRowsConditionally_result:
       if fid == 0:
         if ftype == TType.MAP:
           self.success = {}
-          (_ktype423, _vtype424, _size422 ) = iprot.readMapBegin()
-          for _i426 in xrange(_size422):
-            _key427 = iprot.readString();
-            _val428 = iprot.readI32();
-            self.success[_key427] = _val428
+          (_ktype432, _vtype433, _size431 ) = iprot.readMapBegin()
+          for _i435 in xrange(_size431):
+            _key436 = iprot.readString();
+            _val437 = iprot.readI32();
+            self.success[_key436] = _val437
           iprot.readMapEnd()
         else:
           iprot.skip(ftype)
@@ -17609,9 +17625,9 @@ class updateRowsConditionally_result:
     if self.success is not None:
       oprot.writeFieldBegin('success', TType.MAP, 0)
       oprot.writeMapBegin(TType.STRING, TType.I32, len(self.success))
-      for kiter429,viter430 in self.success.items():
-        oprot.writeString(kiter429)
-        oprot.writeI32(viter430)
+      for kiter438,viter439 in self.success.items():
+        oprot.writeString(kiter438)
+        oprot.writeI32(viter439)
       oprot.writeMapEnd()
       oprot.writeFieldEnd()
     if self.ouch1 is not None:

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/python/ttypes.py
----------------------------------------------------------------------
diff --git a/proxy/src/main/python/ttypes.py b/proxy/src/main/python/ttypes.py
index 5e4c001..9444f71 100644
--- a/proxy/src/main/python/ttypes.py
+++ b/proxy/src/main/python/ttypes.py
@@ -2337,6 +2337,88 @@ class WriterOptions:
   def __ne__(self, other):
     return not (self == other)
 
+class CompactionStrategyConfig:
+  """
+  Attributes:
+   - className
+   - options
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'className', None, None, ), # 1
+    (2, TType.MAP, 'options', (TType.STRING,None,TType.STRING,None), None, ), # 2
+  )
+
+  def __init__(self, className=None, options=None,):
+    self.className = className
+    self.options = options
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.className = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.MAP:
+          self.options = {}
+          (_ktype136, _vtype137, _size135 ) = iprot.readMapBegin()
+          for _i139 in xrange(_size135):
+            _key140 = iprot.readString();
+            _val141 = iprot.readString();
+            self.options[_key140] = _val141
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('CompactionStrategyConfig')
+    if self.className is not None:
+      oprot.writeFieldBegin('className', TType.STRING, 1)
+      oprot.writeString(self.className)
+      oprot.writeFieldEnd()
+    if self.options is not None:
+      oprot.writeFieldBegin('options', TType.MAP, 2)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.options))
+      for kiter142,viter143 in self.options.items():
+        oprot.writeString(kiter142)
+        oprot.writeString(viter143)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
 class UnknownScanner(TException):
   """
   Attributes:

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/ruby/accumulo_proxy.rb
----------------------------------------------------------------------
diff --git a/proxy/src/main/ruby/accumulo_proxy.rb b/proxy/src/main/ruby/accumulo_proxy.rb
index 16f7042..f8d892e 100644
--- a/proxy/src/main/ruby/accumulo_proxy.rb
+++ b/proxy/src/main/ruby/accumulo_proxy.rb
@@ -144,13 +144,13 @@ module Accumulo
         return
       end
 
-      def compactTable(login, tableName, startRow, endRow, iterators, flush, wait)
-        send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait)
+      def compactTable(login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy)
+        send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy)
         recv_compactTable()
       end
 
-      def send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait)
-        send_message('compactTable', CompactTable_args, :login => login, :tableName => tableName, :startRow => startRow, :endRow => endRow, :iterators => iterators, :flush => flush, :wait => wait)
+      def send_compactTable(login, tableName, startRow, endRow, iterators, flush, wait, compactionStrategy)
+        send_message('compactTable', CompactTable_args, :login => login, :tableName => tableName, :startRow => startRow, :endRow => endRow, :iterators => iterators, :flush => flush, :wait => wait, :compactionStrategy => compactionStrategy)
       end
 
       def recv_compactTable()
@@ -1425,7 +1425,7 @@ module Accumulo
         args = read_args(iprot, CompactTable_args)
         result = CompactTable_result.new()
         begin
-          @handler.compactTable(args.login, args.tableName, args.startRow, args.endRow, args.iterators, args.flush, args.wait)
+          @handler.compactTable(args.login, args.tableName, args.startRow, args.endRow, args.iterators, args.flush, args.wait, args.compactionStrategy)
         rescue ::Accumulo::AccumuloSecurityException => ouch1
           result.ouch1 = ouch1
         rescue ::Accumulo::TableNotFoundException => ouch2
@@ -2661,6 +2661,7 @@ module Accumulo
       ITERATORS = 5
       FLUSH = 6
       WAIT = 7
+      COMPACTIONSTRATEGY = 8
 
       FIELDS = {
         LOGIN => {:type => ::Thrift::Types::STRING, :name => 'login', :binary => true},
@@ -2669,7 +2670,8 @@ module Accumulo
         ENDROW => {:type => ::Thrift::Types::STRING, :name => 'endRow', :binary => true},
         ITERATORS => {:type => ::Thrift::Types::LIST, :name => 'iterators', :element => {:type => ::Thrift::Types::STRUCT, :class => ::Accumulo::IteratorSetting}},
         FLUSH => {:type => ::Thrift::Types::BOOL, :name => 'flush'},
-        WAIT => {:type => ::Thrift::Types::BOOL, :name => 'wait'}
+        WAIT => {:type => ::Thrift::Types::BOOL, :name => 'wait'},
+        COMPACTIONSTRATEGY => {:type => ::Thrift::Types::STRUCT, :name => 'compactionStrategy', :class => ::Accumulo::CompactionStrategyConfig}
       }
 
       def struct_fields; FIELDS; end

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/ruby/proxy_types.rb
----------------------------------------------------------------------
diff --git a/proxy/src/main/ruby/proxy_types.rb b/proxy/src/main/ruby/proxy_types.rb
index beeeee4..57306d1 100644
--- a/proxy/src/main/ruby/proxy_types.rb
+++ b/proxy/src/main/ruby/proxy_types.rb
@@ -573,6 +573,24 @@ module Accumulo
     ::Thrift::Struct.generate_accessors self
   end
 
+  class CompactionStrategyConfig
+    include ::Thrift::Struct, ::Thrift::Struct_Union
+    CLASSNAME = 1
+    OPTIONS = 2
+
+    FIELDS = {
+      CLASSNAME => {:type => ::Thrift::Types::STRING, :name => 'className'},
+      OPTIONS => {:type => ::Thrift::Types::MAP, :name => 'options', :key => {:type => ::Thrift::Types::STRING}, :value => {:type => ::Thrift::Types::STRING}}
+    }
+
+    def struct_fields; FIELDS; end
+
+    def validate
+    end
+
+    ::Thrift::Struct.generate_accessors self
+  end
+
   class UnknownScanner < ::Thrift::Exception
     include ::Thrift::Struct, ::Thrift::Struct_Union
     def initialize(message=nil)

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/proxy/src/main/thrift/proxy.thrift
----------------------------------------------------------------------
diff --git a/proxy/src/main/thrift/proxy.thrift b/proxy/src/main/thrift/proxy.thrift
index fbd9c52..25510d1 100644
--- a/proxy/src/main/thrift/proxy.thrift
+++ b/proxy/src/main/thrift/proxy.thrift
@@ -249,6 +249,11 @@ struct WriterOptions {
  5:optional Durability durability
 }
 
+struct CompactionStrategyConfig {
+  1:string className
+  2:map<string,string> options
+}
+
 enum IteratorScope {
   MINC,
   MAJC,
@@ -310,8 +315,10 @@ service AccumuloProxy
   void cloneTable (1:binary login, 2:string tableName, 3:string newTableName, 4:bool flush, 
                    5:map<string,string> propertiesToSet, 6:set<string> propertiesToExclude) 
                                                                                                        throws (1:AccumuloException ouch1, 2:AccumuloSecurityException ouch2, 3:TableNotFoundException ouch3, 4:TableExistsException ouch4);
+  //changed in 1.7.0, see comment at top about compatibility
   void compactTable (1:binary login, 2:string tableName, 3:binary startRow, 4:binary endRow, 
-		     5:list<IteratorSetting> iterators, 6:bool flush, 7:bool wait)                             throws (1:AccumuloSecurityException ouch1, 2:TableNotFoundException ouch2, 3:AccumuloException ouch3);
+		     5:list<IteratorSetting> iterators, 6:bool flush, 7:bool wait, 
+		     8:CompactionStrategyConfig compactionStrategy)                                            throws (1:AccumuloSecurityException ouch1, 2:TableNotFoundException ouch2, 3:AccumuloException ouch3);
   void cancelCompaction(1:binary login, 2:string tableName)                                            throws (1:AccumuloSecurityException ouch1, 2:TableNotFoundException ouch2, 3:AccumuloException ouch3);
                                                                                                             
   void createTable (1:binary login, 2:string tableName, 3:bool versioningIter, 4:TimeType type)        throws (1:AccumuloException ouch1, 2:AccumuloSecurityException ouch2, 3:TableExistsException ouch3);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/CompactionIterators.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/CompactionIterators.java b/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/CompactionIterators.java
deleted file mode 100644
index 4f5bf42..0000000
--- a/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/CompactionIterators.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.accumulo.server.master.tableOps;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.accumulo.core.client.IteratorSetting;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.io.Writable;
-
-public class CompactionIterators implements Writable {
-  byte[] startRow;
-  byte[] endRow;
-  List<IteratorSetting> iterators;
-  
-  public CompactionIterators(byte[] startRow, byte[] endRow, List<IteratorSetting> iterators) {
-    this.startRow = startRow;
-    this.endRow = endRow;
-    this.iterators = iterators;
-  }
-  
-  public CompactionIterators() {
-    startRow = null;
-    endRow = null;
-    iterators = Collections.emptyList();
-  }
-  
-  @Override
-  public void write(DataOutput out) throws IOException {
-    out.writeBoolean(startRow != null);
-    if (startRow != null) {
-      out.writeInt(startRow.length);
-      out.write(startRow);
-    }
-    
-    out.writeBoolean(endRow != null);
-    if (endRow != null) {
-      out.writeInt(endRow.length);
-      out.write(endRow);
-    }
-    
-    out.writeInt(iterators.size());
-    for (IteratorSetting is : iterators) {
-      is.write(out);
-    }
-  }
-  
-  @Override
-  public void readFields(DataInput in) throws IOException {
-    if (in.readBoolean()) {
-      startRow = new byte[in.readInt()];
-      in.readFully(startRow);
-    } else {
-      startRow = null;
-    }
-    
-    if (in.readBoolean()) {
-      endRow = new byte[in.readInt()];
-      in.readFully(endRow);
-    } else {
-      endRow = null;
-    }
-    
-    int num = in.readInt();
-    iterators = new ArrayList<IteratorSetting>(num);
-    
-    for (int i = 0; i < num; i++) {
-      iterators.add(new IteratorSetting(in));
-    }
-  }
-  
-  public Text getEndRow() {
-    if (endRow == null)
-      return null;
-    return new Text(endRow);
-  }
-  
-  public Text getStartRow() {
-    if (startRow == null)
-      return null;
-    return new Text(startRow);
-  }
-  
-  public List<IteratorSetting> getIterators() {
-    return iterators;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/UserCompactionConfig.java
----------------------------------------------------------------------
diff --git a/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/UserCompactionConfig.java b/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/UserCompactionConfig.java
new file mode 100644
index 0000000..6314105
--- /dev/null
+++ b/server/base/src/main/java/org/apache/accumulo/server/master/tableOps/UserCompactionConfig.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.accumulo.server.master.tableOps;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.accumulo.core.client.admin.CompactionStrategyConfig;
+import org.apache.accumulo.core.client.impl.CompactionStrategyConfigUtil;
+
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.Writable;
+
+public class UserCompactionConfig implements Writable {
+  byte[] startRow;
+  byte[] endRow;
+  List<IteratorSetting> iterators;
+  private CompactionStrategyConfig compactionStrategy;
+
+  public UserCompactionConfig(byte[] startRow, byte[] endRow, List<IteratorSetting> iterators, CompactionStrategyConfig csc) {
+    this.startRow = startRow;
+    this.endRow = endRow;
+    this.iterators = iterators;
+    this.compactionStrategy = csc;
+  }
+
+  public UserCompactionConfig() {
+    startRow = null;
+    endRow = null;
+    iterators = Collections.emptyList();
+  }
+
+  @Override
+  public void write(DataOutput out) throws IOException {
+    out.writeBoolean(startRow != null);
+    if (startRow != null) {
+      out.writeInt(startRow.length);
+      out.write(startRow);
+    }
+
+    out.writeBoolean(endRow != null);
+    if (endRow != null) {
+      out.writeInt(endRow.length);
+      out.write(endRow);
+    }
+
+    out.writeInt(iterators.size());
+    for (IteratorSetting is : iterators) {
+      is.write(out);
+    }
+
+    CompactionStrategyConfigUtil.encode(out, compactionStrategy);
+
+  }
+
+  @Override
+  public void readFields(DataInput in) throws IOException {
+    if (in.readBoolean()) {
+      startRow = new byte[in.readInt()];
+      in.readFully(startRow);
+    } else {
+      startRow = null;
+    }
+
+    if (in.readBoolean()) {
+      endRow = new byte[in.readInt()];
+      in.readFully(endRow);
+    } else {
+      endRow = null;
+    }
+
+    int num = in.readInt();
+    iterators = new ArrayList<IteratorSetting>(num);
+
+    for (int i = 0; i < num; i++) {
+      iterators.add(new IteratorSetting(in));
+    }
+
+    compactionStrategy = CompactionStrategyConfigUtil.decode(in);
+  }
+
+  public Text getEndRow() {
+    if (endRow == null)
+      return null;
+    return new Text(endRow);
+  }
+
+  public Text getStartRow() {
+    if (startRow == null)
+      return null;
+    return new Text(startRow);
+  }
+
+  public List<IteratorSetting> getIterators() {
+    return iterators;
+  }
+
+  public CompactionStrategyConfig getCompactionStrategy() {
+    return compactionStrategy;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/2f788f48/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
----------------------------------------------------------------------
diff --git a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
index bdb5e2f..5207745 100644
--- a/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
+++ b/server/master/src/main/java/org/apache/accumulo/master/FateServiceHandler.java
@@ -31,6 +31,8 @@ import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.impl.CompactionStrategyConfigUtil;
+import org.apache.accumulo.core.client.admin.CompactionStrategyConfig;
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.client.NamespaceNotFoundException;
 import org.apache.accumulo.core.client.TableNotFoundException;
@@ -370,6 +372,7 @@ class FateServiceHandler implements FateService.Iface {
         byte[] startRow = ByteBufferUtil.toBytes(arguments.get(1));
         byte[] endRow = ByteBufferUtil.toBytes(arguments.get(2));
         List<IteratorSetting> iterators = IteratorUtil.decodeIteratorSettings(ByteBufferUtil.toBytes(arguments.get(3)));
+        CompactionStrategyConfig compactionStrategy = CompactionStrategyConfigUtil.decode(ByteBufferUtil.toBytes(arguments.get(4)));
         String namespaceId = Tables.getNamespaceId(master.getInstance(), tableId);
 
         final boolean canCompact;
@@ -383,7 +386,7 @@ class FateServiceHandler implements FateService.Iface {
         if (!canCompact)
           throw new ThriftSecurityException(c.getPrincipal(), SecurityErrorCode.PERMISSION_DENIED);
 
-        master.fate.seedTransaction(opid, new TraceRepo<Master>(new CompactRange(tableId, startRow, endRow, iterators)), autoCleanup);
+        master.fate.seedTransaction(opid, new TraceRepo<Master>(new CompactRange(tableId, startRow, endRow, iterators, compactionStrategy)), autoCleanup);
         break;
       }
       case TABLE_CANCEL_COMPACT: {


Mime
View raw message