You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2021/02/01 15:52:12 UTC

[kudu] branch master updated (8c5e655 -> 3ac0633)

This is an automated email from the ASF dual-hosted git repository.

alexey pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git.


    from 8c5e655  KUDU-2612: loosen restrictions for BEGIN_COMMIT ops
     new 361f9aa  [java] address warnings from the SonarLint tool
     new 3ac0633  [docs] minor update on the known issues

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/known_issues.adoc                             |  11 +-
 .../org/apache/kudu/client/AsyncKuduClient.java    |  38 ++---
 .../org/apache/kudu/client/AsyncKuduScanner.java   |  14 +-
 .../org/apache/kudu/client/AsyncKuduSession.java   | 169 +++++++++++----------
 .../org/apache/kudu/client/AuthzTokenCache.java    |   8 +-
 .../kudu/client/ColumnarRowResultIterator.java     |  19 ++-
 .../org/apache/kudu/client/ConnectToCluster.java   |  18 +--
 .../apache/kudu/client/ConnectToMasterRequest.java |   4 +-
 .../org/apache/kudu/client/CreateTableOptions.java |   1 -
 .../main/java/org/apache/kudu/client/IPCUtil.java  |   4 +
 .../java/org/apache/kudu/client/KeyEncoder.java    |   2 +-
 .../java/org/apache/kudu/client/KuduClient.java    |   5 +-
 .../java/org/apache/kudu/client/KuduPredicate.java |   1 -
 .../java/org/apache/kudu/client/KuduSession.java   |   5 +-
 .../java/org/apache/kudu/client/LocatedTablet.java |   4 +-
 .../org/apache/kudu/client/RowResultIterator.java  |   9 +-
 .../kudu/client/RowwiseRowResultIterator.java      |  14 +-
 .../main/java/org/apache/kudu/client/RpcProxy.java |   2 +-
 .../apache/kudu/client/SessionConfiguration.java   |   1 +
 .../java/org/apache/kudu/client/Statistics.java    |   2 +-
 .../main/java/org/apache/kudu/util/AsyncUtil.java  |   4 +
 .../main/java/org/apache/kudu/util/CharUtil.java   |   4 +
 .../java/org/apache/kudu/util/DataGenerator.java   |   5 +-
 .../main/java/org/apache/kudu/util/DateUtil.java   |   4 +
 .../java/org/apache/kudu/util/DecimalUtil.java     |   5 +-
 .../main/java/org/apache/kudu/util/HashUtil.java   |   6 +-
 .../java/org/apache/kudu/util/HybridTimeUtil.java  |   4 +
 .../main/java/org/apache/kudu/util/NetUtil.java    |   4 +
 .../java/org/apache/kudu/util/SchemaGenerator.java |   2 +-
 .../main/java/org/apache/kudu/util/StringUtil.java |   8 +-
 .../java/org/apache/kudu/util/TimestampUtil.java   |   4 +
 31 files changed, 207 insertions(+), 174 deletions(-)


[kudu] 01/02: [java] address warnings from the SonarLint tool

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit 361f9aac615e9da021926cd5c82947a7f4b46320
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Thu Jan 21 19:45:18 2021 -0800

    [java] address warnings from the SonarLint tool
    
    This patch addresses some warnings (mostly "low-hanging fruits")
    reported by the SonarLint tool.
    
    This patch does not contain any functional modifications.
    
    Change-Id: I306575b370fb69a54fdc24b9d770a99291828ef7
    Reviewed-on: http://gerrit.cloudera.org:8080/16969
    Tested-by: Alexey Serbin <as...@cloudera.com>
    Reviewed-by: Grant Henke <gr...@apache.org>
---
 .../org/apache/kudu/client/AsyncKuduClient.java    |  38 ++---
 .../org/apache/kudu/client/AsyncKuduScanner.java   |  14 +-
 .../org/apache/kudu/client/AsyncKuduSession.java   | 169 +++++++++++----------
 .../org/apache/kudu/client/AuthzTokenCache.java    |   8 +-
 .../kudu/client/ColumnarRowResultIterator.java     |  19 ++-
 .../org/apache/kudu/client/ConnectToCluster.java   |  18 +--
 .../apache/kudu/client/ConnectToMasterRequest.java |   4 +-
 .../org/apache/kudu/client/CreateTableOptions.java |   1 -
 .../main/java/org/apache/kudu/client/IPCUtil.java  |   4 +
 .../java/org/apache/kudu/client/KeyEncoder.java    |   2 +-
 .../java/org/apache/kudu/client/KuduClient.java    |   5 +-
 .../java/org/apache/kudu/client/KuduPredicate.java |   1 -
 .../java/org/apache/kudu/client/KuduSession.java   |   5 +-
 .../java/org/apache/kudu/client/LocatedTablet.java |   4 +-
 .../org/apache/kudu/client/RowResultIterator.java  |   9 +-
 .../kudu/client/RowwiseRowResultIterator.java      |  14 +-
 .../main/java/org/apache/kudu/client/RpcProxy.java |   2 +-
 .../apache/kudu/client/SessionConfiguration.java   |   1 +
 .../java/org/apache/kudu/client/Statistics.java    |   2 +-
 .../main/java/org/apache/kudu/util/AsyncUtil.java  |   4 +
 .../main/java/org/apache/kudu/util/CharUtil.java   |   4 +
 .../java/org/apache/kudu/util/DataGenerator.java   |   5 +-
 .../main/java/org/apache/kudu/util/DateUtil.java   |   4 +
 .../java/org/apache/kudu/util/DecimalUtil.java     |   5 +-
 .../main/java/org/apache/kudu/util/HashUtil.java   |   6 +-
 .../java/org/apache/kudu/util/HybridTimeUtil.java  |   4 +
 .../main/java/org/apache/kudu/util/NetUtil.java    |   4 +
 .../java/org/apache/kudu/util/SchemaGenerator.java |   2 +-
 .../main/java/org/apache/kudu/util/StringUtil.java |   8 +-
 .../java/org/apache/kudu/util/TimestampUtil.java   |   4 +
 30 files changed, 200 insertions(+), 170 deletions(-)

diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduClient.java b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduClient.java
index 5f2822f..d8ba883 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduClient.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduClient.java
@@ -884,9 +884,9 @@ public class AsyncKuduClient implements AutoCloseable {
                                                                   timer,
                                                                   defaultAdminOperationTimeoutMs);
 
-    return sendRpcToTablet(rpc).addCallback(resp -> {
-      return new KuduTableStatistics(resp.getOnDiskSize(), resp.getLiveRowCount());
-    });
+    return sendRpcToTablet(rpc).addCallback(resp ->
+        new KuduTableStatistics(resp.getOnDiskSize(), resp.getLiveRowCount())
+    );
   }
 
   /**
@@ -972,7 +972,7 @@ public class AsyncKuduClient implements AutoCloseable {
         .addCallback(new MasterLookupCB(masterTable,
                                         /* partitionKey */ null,
                                         /* requestedBatchSize */ 1))
-        .addCallback((Callback<Void, Object>) ignored -> {
+        .addCallback(ignored -> {
           // Just call ourselves again; we're guaranteed to have the
           // authentication credentials.
           assert hasConnectedToMaster;
@@ -1025,7 +1025,7 @@ public class AsyncKuduClient implements AutoCloseable {
         .addCallback(new MasterLookupCB(masterTable,
                                         /* partitionKey */ null,
                                         /* requestedBatchSize */ 1))
-        .addCallback((Callback<Void, Object>) ignored -> {
+        .addCallback(ignored -> {
           // Just call ourselves again; we're guaranteed to have the HMS config.
           assert hasConnectedToMaster;
           doGetHiveMetastoreConfig(fakeRpc);
@@ -1452,7 +1452,7 @@ public class AsyncKuduClient implements AutoCloseable {
       @Nonnull final String method,
       @Nullable final KuduRpc<?> parent,
       long timeoutMs) {
-    KuduRpc<R> rpc = new FakeKuduRpc<R>(method, timer, timeoutMs);
+    KuduRpc<R> rpc = new FakeKuduRpc<>(method, timer, timeoutMs);
     rpc.setParentRpc(parent);
     return rpc;
   }
@@ -1711,6 +1711,14 @@ public class AsyncKuduClient implements AutoCloseable {
     public String toString() {
       return "release master lookup permit";
     }
+
+    /**
+     * Releases a master lookup permit that was acquired.
+     * See {@link AsyncKuduClient#acquireMasterLookupPermit}.
+     */
+    private void releaseMasterLookupPermit() {
+      masterLookups.release();
+    }
   }
 
   long getSleepTimeForRpcMillis(KuduRpc<?> rpc) {
@@ -1850,16 +1858,16 @@ public class AsyncKuduClient implements AutoCloseable {
                 }
               }
 
-              HiveMetastoreConfig hiveMetastoreConfig = null;
+              HiveMetastoreConfig config = null;
               Master.ConnectToMasterResponsePB respPb = resp.getConnectResponse();
               if (respPb.hasHmsConfig()) {
                 Master.HiveMetastoreConfig metastoreConf = respPb.getHmsConfig();
-                hiveMetastoreConfig = new HiveMetastoreConfig(metastoreConf.getHmsUris(),
-                                                              metastoreConf.getHmsSaslEnabled(),
-                                                              metastoreConf.getHmsUuid());
+                config = new HiveMetastoreConfig(metastoreConf.getHmsUris(),
+                                                 metastoreConf.getHmsSaslEnabled(),
+                                                 metastoreConf.getHmsUuid());
               }
               synchronized (AsyncKuduClient.this) {
-                AsyncKuduClient.this.hiveMetastoreConfig = hiveMetastoreConfig;
+                hiveMetastoreConfig = config;
                 location = respPb.getClientLocation();
                 clusterId = respPb.getClusterId();
               }
@@ -2319,14 +2327,6 @@ public class AsyncKuduClient implements AutoCloseable {
   }
 
   /**
-   * Releases a master lookup permit that was acquired.
-   * @see #acquireMasterLookupPermit
-   */
-  private void releaseMasterLookupPermit() {
-    masterLookups.release();
-  }
-
-  /**
    * Makes discovered tablet locations visible in the client's caches.
    * @param table the table which the locations belong to
    * @param requestPartitionKey the partition key of the table locations request
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduScanner.java b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduScanner.java
index c736bb5..9206495 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduScanner.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduScanner.java
@@ -580,7 +580,7 @@ public final class AsyncKuduScanner {
           sequenceId++;
           hasMore = resp.more;
           if (LOG.isDebugEnabled()) {
-            LOG.debug("Scanner " + Bytes.pretty(scannerId) + " opened on " + tablet);
+            LOG.debug("Scanner {} opened on {}", Bytes.pretty(scannerId), tablet);
           }
           return Deferred.fromResult(resp.data);
         }
@@ -665,7 +665,6 @@ public final class AsyncKuduScanner {
           }
           sequenceId++;
           hasMore = resp.more;
-          //LOG.info("Scan.next is returning rows: " + resp.data.getNumRows());
           return resp.data;
         }
 
@@ -755,8 +754,7 @@ public final class AsyncKuduScanner {
       public RowResultIterator call(Response response) {
         closed = true;
         if (LOG.isDebugEnabled()) {
-          LOG.debug("Scanner " + Bytes.pretty(scannerId) + " closed on " +
-              tablet);
+          LOG.debug("Scanner {} closed on {}", Bytes.pretty(scannerId), tablet);
         }
         invalidate();
         scannerId = "client debug closed".getBytes(UTF_8);   // Make debugging easier.
@@ -1109,10 +1107,8 @@ public final class AsyncKuduScanner {
             }
           }
 
-          if (isFaultTolerant) {
-            if (AsyncKuduScanner.this.lastPrimaryKey.length > 0) {
-              newBuilder.setLastPrimaryKey(UnsafeByteOperations.unsafeWrap(lastPrimaryKey));
-            }
+          if (isFaultTolerant && AsyncKuduScanner.this.lastPrimaryKey.length > 0) {
+            newBuilder.setLastPrimaryKey(UnsafeByteOperations.unsafeWrap(lastPrimaryKey));
           }
 
           if (AsyncKuduScanner.this.startPrimaryKey.length > 0) {
@@ -1209,7 +1205,7 @@ public final class AsyncKuduScanner {
                                         : AsyncKuduClient.NO_TIMESTAMP,
           resp.getLastPrimaryKey().toByteArray(), resourceMetricsPB);
       if (LOG.isDebugEnabled()) {
-        LOG.debug("{} for scanner {}", response.toString(), AsyncKuduScanner.this);
+        LOG.debug("{} for scanner {}", response, AsyncKuduScanner.this);
       }
       return new Pair<>(response, error);
     }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduSession.java b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduSession.java
index 5d84168..59eb838 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduSession.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/AsyncKuduSession.java
@@ -332,17 +332,6 @@ public class AsyncKuduSession implements SessionConfiguration {
   }
 
   /**
-   * Returns a buffer to the inactive queue after flushing.
-   * @param buffer the buffer to return to the inactive queue.
-   */
-  private void queueBuffer(Buffer buffer) {
-    inactiveBuffers.add(buffer);
-    buffer.callbackFlushNotification();
-    Deferred<Void> localFlushNotification = flushNotification.getAndSet(new Deferred<>());
-    localFlushNotification.callback(null);
-  }
-
-  /**
    * Callback which waits for all tablet location lookups to complete, groups all operations into
    * batches by tablet, and dispatches them. When all of the batches are complete, a deferred is
    * fired and the buffer is added to the inactive queue.
@@ -440,6 +429,90 @@ public class AsyncKuduSession implements SessionConfiguration {
 
       return null;
     }
+
+    /**
+     * Creates callbacks to handle a multi-put and adds them to the request.
+     * @param request the request for which we must handle the response
+     */
+    private void addBatchCallbacks(final Batch request) {
+      final class BatchCallback implements Callback<BatchResponse, BatchResponse> {
+        @Override
+        public BatchResponse call(final BatchResponse response) {
+          LOG.trace("Got a Batch response for {} rows", request.operations.size());
+          AsyncKuduSession.this.client.updateLastPropagatedTimestamp(response.getWriteTimestamp());
+
+          // Send individualized responses to all the operations in this batch.
+          for (OperationResponse operationResponse : response.getIndividualResponses()) {
+            if (flushMode == FlushMode.AUTO_FLUSH_BACKGROUND && operationResponse.hasRowError()) {
+              errorCollector.addError(operationResponse.getRowError());
+            }
+
+            // Fire the callback after collecting the errors so that the errors
+            // are visible should the callback interrogate the error collector.
+            operationResponse.getOperation().callback(operationResponse);
+          }
+
+          return response;
+        }
+
+        @Override
+        public String toString() {
+          return "apply batch response";
+        }
+      }
+
+      final class BatchErrCallback implements Callback<Object, Exception> {
+        @Override
+        public Object call(Exception e) {
+          // If the exception we receive is a KuduException we're going to build OperationResponses.
+          Status status = null;
+          List<OperationResponse> responses = null;
+          boolean handleKuduException = e instanceof KuduException;
+          if (handleKuduException) {
+            status = ((KuduException) e).getStatus();
+            responses = new ArrayList<>(request.operations.size());
+          }
+
+          for (Operation operation : request.operations) {
+            // Same comment as in BatchCallback regarding the ordering of when to callback.
+            if (handleKuduException) {
+              RowError rowError = new RowError(status, operation);
+              OperationResponse response = new OperationResponse(0, null, 0, operation, rowError);
+              errorCollector.addError(rowError);
+              responses.add(response);
+
+              operation.callback(response);
+            } else {
+              // We have no idea what the exception is so we'll just send it up.
+              operation.errback(e);
+            }
+          }
+
+          // Note that returning an object that's not an exception will make us leave the
+          // errback chain. Effectively, the BatchResponse below will end up as part of the list
+          // passed to ConvertBatchToListOfResponsesCB.
+          return handleKuduException ? new BatchResponse(responses, request.operationIndexes) : e;
+        }
+
+        @Override
+        public String toString() {
+          return "apply batch error response";
+        }
+      }
+
+      request.getDeferred().addCallbacks(new BatchCallback(), new BatchErrCallback());
+    }
+
+    /**
+     * Returns a buffer to the inactive queue after flushing.
+     * @param buffer the buffer to return to the inactive queue.
+     */
+    private void queueBuffer(Buffer buffer) {
+      inactiveBuffers.add(buffer);
+      buffer.callbackFlushNotification();
+      Deferred<Void> localFlushNotification = flushNotification.getAndSet(new Deferred<>());
+      localFlushNotification.callback(null);
+    }
   }
 
   /**
@@ -531,7 +604,7 @@ public class AsyncKuduSession implements SessionConfiguration {
   public boolean hasPendingOperations() {
     synchronized (monitor) {
       return activeBuffer == null ? inactiveBuffers.size() < 2 :
-             activeBuffer.getOperations().size() > 0 || !inactiveBufferAvailable();
+             !activeBuffer.getOperations().isEmpty() || !inactiveBufferAvailable();
     }
   }
 
@@ -718,78 +791,6 @@ public class AsyncKuduSession implements SessionConfiguration {
     }
   }
 
-  /**
-   * Creates callbacks to handle a multi-put and adds them to the request.
-   * @param request the request for which we must handle the response
-   */
-  private void addBatchCallbacks(final Batch request) {
-    final class BatchCallback implements Callback<BatchResponse, BatchResponse> {
-      @Override
-      public BatchResponse call(final BatchResponse response) {
-        LOG.trace("Got a Batch response for {} rows", request.operations.size());
-        AsyncKuduSession.this.client.updateLastPropagatedTimestamp(response.getWriteTimestamp());
-
-        // Send individualized responses to all the operations in this batch.
-        for (OperationResponse operationResponse : response.getIndividualResponses()) {
-          if (flushMode == FlushMode.AUTO_FLUSH_BACKGROUND && operationResponse.hasRowError()) {
-            errorCollector.addError(operationResponse.getRowError());
-          }
-
-          // Fire the callback after collecting the errors so that the errors are visible should the
-          // callback interrogate the error collector.
-          operationResponse.getOperation().callback(operationResponse);
-        }
-
-        return response;
-      }
-
-      @Override
-      public String toString() {
-        return "apply batch response";
-      }
-    }
-
-    final class BatchErrCallback implements Callback<Object, Exception> {
-      @Override
-      public Object call(Exception e) {
-        // If the exception we receive is a KuduException we're going to build OperationResponses.
-        Status status = null;
-        List<OperationResponse> responses = null;
-        boolean handleKuduException = e instanceof KuduException;
-        if (handleKuduException) {
-          status = ((KuduException) e).getStatus();
-          responses = new ArrayList<>(request.operations.size());
-        }
-
-        for (Operation operation : request.operations) {
-          // Same comment as in BatchCallback regarding the ordering of when to callback.
-          if (handleKuduException) {
-            RowError rowError = new RowError(status, operation);
-            OperationResponse response = new OperationResponse(0, null, 0, operation, rowError);
-            errorCollector.addError(rowError);
-            responses.add(response);
-
-            operation.callback(response);
-          } else {
-            // We have no idea what the exception is so we'll just send it up.
-            operation.errback(e);
-          }
-        }
-
-        // Note that returning an object that's not an exception will make us leave the
-        // errback chain. Effectively, the BatchResponse below will end up as part of the list
-        // passed to ConvertBatchToListOfResponsesCB.
-        return handleKuduException ? new BatchResponse(responses, request.operationIndexes) : e;
-      }
-
-      @Override
-      public String toString() {
-        return "apply batch error response";
-      }
-    }
-
-    request.getDeferred().addCallbacks(new BatchCallback(), new BatchErrCallback());
-  }
 
   /**
    * Analogous to BatchErrCallback above but for AUTO_FLUSH_SYNC which doesn't handle lists of
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/AuthzTokenCache.java b/java/kudu-client/src/main/java/org/apache/kudu/client/AuthzTokenCache.java
index c774edf..c83b1e5 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/AuthzTokenCache.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/AuthzTokenCache.java
@@ -132,7 +132,7 @@ public class AuthzTokenCache {
       pendingRetries = retriesForTable.remove(tableId);
     }
     Preconditions.checkState(!pendingRetries.isEmpty(),
-        "no pending retries for table " + tableId);
+        "no pending retries for table %s", tableId);
     return pendingRetries;
   }
 
@@ -150,7 +150,7 @@ public class AuthzTokenCache {
                                    @Nonnull Callback<Void, GetTableSchemaResponse> cb,
                                    @Nonnull Callback<Void, Exception> eb) {
     String tableId = parentRpc.getTable().getTableId();
-    LOG.debug("sending RPC to retrieve token for table ID " + tableId);
+    LOG.debug("sending RPC to retrieve token for table ID {}", tableId);
     GetTableSchemaRequest retrieveAuthzTokenReq = new GetTableSchemaRequest(
         client.getMasterTable(), tableId, /*name=*/null, client.getTimer(),
         client.getDefaultAdminOperationTimeoutMs(), /*requiresAuthzTokenSupport=*/true);
@@ -190,7 +190,7 @@ public class AuthzTokenCache {
           throw new NonRecoverableException(
               Status.InvalidArgument("no authz token retrieved for " + tableId));
         }
-        LOG.debug("retrieved authz token for " + tableId);
+        LOG.debug("retrieved authz token for {}", tableId);
         put(tableId, resp.getAuthzToken());
         for (RpcAndException rpcAndEx : clearPendingRetries(tableId)) {
           client.handleRetryableErrorNoDelay(rpcAndEx.rpc, rpcAndEx.ex);
@@ -237,7 +237,7 @@ public class AuthzTokenCache {
         sendRetrievalForRpc(rpc, newTokenCB, newTokenErrB);
       } else {
         Preconditions.checkState(!pendingRetries.isEmpty(),
-            "no pending retries for table " + tableId);
+            "no pending retries for table %s", tableId);
         pendingRetries.add(rpcAndEx);
       }
     }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/ColumnarRowResultIterator.java b/java/kudu-client/src/main/java/org/apache/kudu/client/ColumnarRowResultIterator.java
index 07e5d9e..78d631d 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/ColumnarRowResultIterator.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/ColumnarRowResultIterator.java
@@ -56,14 +56,14 @@ class ColumnarRowResultIterator extends RowResultIterator {
    * @param reuseRowResult reuse same row result for next row
    */
   ColumnarRowResultIterator(long elapsedMillis,
-                                    String tsUUID,
-                                    Schema schema,
-                                    int numRows,
-                                    Slice[] data,
-                                    Slice[] varlenData,
-                                    Slice[] nonNullBitmaps,
-                                    boolean reuseRowResult) {
-    super(elapsedMillis, tsUUID, schema, numRows, reuseRowResult);
+                            String tsUUID,
+                            Schema schema,
+                            int numRows,
+                            Slice[] data,
+                            Slice[] varlenData,
+                            Slice[] nonNullBitmaps,
+                            boolean reuseRowResult) {
+    super(elapsedMillis, tsUUID, schema, numRows);
     this.data = data;
     this.varlenData = varlenData;
     this.nonNullBitmaps = nonNullBitmaps;
@@ -77,8 +77,7 @@ class ColumnarRowResultIterator extends RowResultIterator {
                                                          Schema schema,
                                                          WireProtocol.ColumnarRowBlockPB data,
                                                          final CallResponse callResponse,
-                                                         boolean reuseRowResult)
-      throws KuduException {
+                                                         boolean reuseRowResult) {
     if (data == null || data.getNumRows() == 0) {
       return new ColumnarRowResultIterator(elapsedMillis, tsUUID, schema, 0,
               null, null, null, reuseRowResult);
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToCluster.java b/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToCluster.java
index f11da51..e25ab11 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToCluster.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToCluster.java
@@ -315,15 +315,6 @@ final class ConnectToCluster {
     }
   }
 
-  private void recordKnownMasters(ConnectToMasterResponsePB r) {
-    // Old versions don't set this field.
-    if (r.getMasterAddrsCount() == 0) {
-      return;
-    }
-
-    knownMasters.compareAndSet(null, r.getMasterAddrsList());
-  }
-
   /**
    * Callback for each ConnectToCluster RPC sent in connectToMaster() above.
    * If a request (paired to a specific master) returns a reply that indicates it's a leader,
@@ -364,6 +355,15 @@ final class ConnectToCluster {
     public String toString() {
       return "ConnectToMasterCB for " + hostAndPort.toString();
     }
+
+    private void recordKnownMasters(ConnectToMasterResponsePB r) {
+      // Old versions don't set this field.
+      if (r.getMasterAddrsCount() == 0) {
+        return;
+      }
+
+      knownMasters.compareAndSet(null, r.getMasterAddrsList());
+    }
   }
 
   /**
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToMasterRequest.java b/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToMasterRequest.java
index 8a0c713..18acebf 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToMasterRequest.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/ConnectToMasterRequest.java
@@ -102,8 +102,8 @@ public class ConnectToMasterRequest extends KuduRpc<ConnectToMasterResponsePB> {
         respBuilder.hasError() ? respBuilder.getError() : null);
   }
 
-  private Pair<ConnectToMasterResponsePB, Object> deserializeOldRpc(CallResponse callResponse)
-      throws KuduException {
+  private Pair<ConnectToMasterResponsePB, Object> deserializeOldRpc(
+      CallResponse callResponse) {
     final GetMasterRegistrationResponsePB.Builder resp =
         GetMasterRegistrationResponsePB.newBuilder();
     readProtobuf(callResponse.getPBMessage(), resp);
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/CreateTableOptions.java b/java/kudu-client/src/main/java/org/apache/kudu/client/CreateTableOptions.java
index 94dff93..8949d2b 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/CreateTableOptions.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/CreateTableOptions.java
@@ -21,7 +21,6 @@ import java.util.List;
 import java.util.Map;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.yetus.audience.InterfaceAudience;
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/IPCUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/client/IPCUtil.java
index 7c02ab4..16ece95 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/IPCUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/IPCUtil.java
@@ -31,6 +31,10 @@ import org.apache.yetus.audience.InterfaceAudience;
  */
 @InterfaceAudience.Private
 public class IPCUtil {
+
+  private IPCUtil() {
+  }
+
   /**
    * Write out header, param, and cell block if there is one.
    * @param dos
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/KeyEncoder.java b/java/kudu-client/src/main/java/org/apache/kudu/client/KeyEncoder.java
index 71a71ec..fd3ec69 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/KeyEncoder.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/KeyEncoder.java
@@ -469,7 +469,7 @@ class KeyEncoder {
       sb.append(hashBuckets);
     }
 
-    if (partitionSchema.getRangeSchema().getColumnIds().size() > 0) {
+    if (!partitionSchema.getRangeSchema().getColumnIds().isEmpty()) {
       if (!hashBuckets.isEmpty()) {
         sb.append(", ");
       }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduClient.java b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduClient.java
index cf7806d..a77689b 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduClient.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduClient.java
@@ -41,7 +41,7 @@ import org.apache.kudu.master.Master.TableIdentifierPB;
 @InterfaceStability.Evolving
 public class KuduClient implements AutoCloseable {
 
-  private static final Logger LOG = LoggerFactory.getLogger(AsyncKuduClient.class);
+  private static final Logger LOG = LoggerFactory.getLogger(KuduClient.class);
   public static final long NO_TIMESTAMP = -1;
 
   @InterfaceAudience.LimitedPrivate("Test")
@@ -542,7 +542,8 @@ public class KuduClient implements AutoCloseable {
      * @return this builder
      * @deprecated socket read timeouts are no longer used
      */
-    @Deprecated public KuduClientBuilder defaultSocketReadTimeoutMs(long timeoutMs) {
+    @Deprecated
+    public KuduClientBuilder defaultSocketReadTimeoutMs(long timeoutMs) {
       LOG.info("defaultSocketReadTimeoutMs is deprecated");
       return this;
     }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
index f8dae24..67c611e 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduPredicate.java
@@ -24,7 +24,6 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.sql.Date;
 import java.sql.Timestamp;
-import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduSession.java b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduSession.java
index 0916467..8f0870e 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/KuduSession.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/KuduSession.java
@@ -121,7 +121,7 @@ public class KuduSession implements SessionConfiguration {
   }
 
   @Override
-  public void setFlushMode(AsyncKuduSession.FlushMode flushMode) {
+  public void setFlushMode(FlushMode flushMode) {
     session.setFlushMode(flushMode);
   }
 
@@ -135,6 +135,9 @@ public class KuduSession implements SessionConfiguration {
     session.setErrorCollectorSpace(size);
   }
 
+  /**
+   * @deprecated
+   */
   @Override
   @Deprecated
   public void setMutationBufferLowWatermark(float mutationBufferLowWatermarkPercentage) {
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/LocatedTablet.java b/java/kudu-client/src/main/java/org/apache/kudu/client/LocatedTablet.java
index 63c2a15..8003a15 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/LocatedTablet.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/LocatedTablet.java
@@ -57,7 +57,7 @@ public class LocatedTablet {
   }
 
   /**
-   * DEPRECATED: use {@link #getPartition()}
+   * @deprecated use {@link #getPartition()}
    */
   @Deprecated
   public byte[] getStartKey() {
@@ -65,7 +65,7 @@ public class LocatedTablet {
   }
 
   /**
-   * DEPRECATED: use {@link #getPartition()}
+   * @deprecated use {@link #getPartition()}
    */
   @Deprecated()
   public byte[] getEndKey() {
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/RowResultIterator.java b/java/kudu-client/src/main/java/org/apache/kudu/client/RowResultIterator.java
index d9abc30..8c3cf05 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/RowResultIterator.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/RowResultIterator.java
@@ -45,11 +45,10 @@ public abstract class RowResultIterator extends KuduRpcResponse implements Itera
    * @param schema schema used to parse the rows
    * @param numRows how many rows are contained in the bs slice
    */
-  protected RowResultIterator(long elapsedMillis,
-                            String tsUUID,
-                            Schema schema,
-                            int numRows,
-                            boolean reuseRowResult) {
+  RowResultIterator(long elapsedMillis,
+                    String tsUUID,
+                    Schema schema,
+                    int numRows) {
     super(elapsedMillis, tsUUID);
     this.schema = schema;
     this.numRows = numRows;
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/RowwiseRowResultIterator.java b/java/kudu-client/src/main/java/org/apache/kudu/client/RowwiseRowResultIterator.java
index 9c6c440..d2d9a0b 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/RowwiseRowResultIterator.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/RowwiseRowResultIterator.java
@@ -53,13 +53,13 @@ class RowwiseRowResultIterator extends RowResultIterator {
    * @param reuseRowResult reuse same row result for next row
    */
   RowwiseRowResultIterator(long elapsedMillis,
-                                   String tsUUID,
-                                   Schema schema,
-                                   int numRows,
-                                   Slice bs,
-                                   Slice indirectBs,
-                                   boolean reuseRowResult) {
-    super(elapsedMillis, tsUUID, schema, numRows, reuseRowResult);
+                           String tsUUID,
+                           Schema schema,
+                           int numRows,
+                           Slice bs,
+                           Slice indirectBs,
+                           boolean reuseRowResult) {
+    super(elapsedMillis, tsUUID, schema, numRows);
     this.bs = bs;
     this.indirectBs = indirectBs;
 
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/RpcProxy.java b/java/kudu-client/src/main/java/org/apache/kudu/client/RpcProxy.java
index ce0fd92..cf564b9 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/RpcProxy.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/RpcProxy.java
@@ -128,7 +128,7 @@ class RpcProxy {
       // Throw an exception to enable testing failures. See `failNextRpcs`.
       if (staticNumFail > 0) {
         staticNumFail--;
-        LOG.warn("Forcing a failure on sendRpc: " + rpc);
+        LOG.warn("Forcing a failure on sendRpc: {}", rpc);
         throw staticException;
       }
       if (!rpc.getRequiredFeatures().isEmpty()) {
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/SessionConfiguration.java b/java/kudu-client/src/main/java/org/apache/kudu/client/SessionConfiguration.java
index c2071b6..d3e942d 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/SessionConfiguration.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/SessionConfiguration.java
@@ -104,6 +104,7 @@ public interface SessionConfiguration {
    * 0 and 1
    * @deprecated The low watermark no longer has any effect.
    */
+  @Deprecated
   void setMutationBufferLowWatermark(float mutationBufferLowWatermarkPercentage);
 
   /**
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/client/Statistics.java b/java/kudu-client/src/main/java/org/apache/kudu/client/Statistics.java
index ca87151..c4b0c0f 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/client/Statistics.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/client/Statistics.java
@@ -152,7 +152,7 @@ public class Statistics {
     // which is only a Map method in Java 8.
     //
     // See KUDU-2188 for details.
-    for (String tablet : ((Map<String, Statistics.TabletStatistics>) stsMap).keySet()) {
+    for (String tablet : stsMap.keySet()) {
       tablets.add(tablet);
     }
     return tablets;
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/AsyncUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/AsyncUtil.java
index 57d2c23..3bfacff 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/AsyncUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/AsyncUtil.java
@@ -29,6 +29,10 @@ import org.apache.yetus.audience.InterfaceAudience;
 @InterfaceAudience.Private
 public class AsyncUtil {
 
+  /** Non-constructable utility class. */
+  private AsyncUtil() {
+  }
+
   /**
    * Register a callback and an "errback".
    * <p>
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/CharUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/CharUtil.java
index 98ed31a..e08879b 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/CharUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/CharUtil.java
@@ -26,6 +26,10 @@ public class CharUtil {
   public static final int MIN_VARCHAR_LENGTH = 1;
   public static final int MAX_VARCHAR_LENGTH = 65535;
 
+  /** Non-constructable utility class. */
+  private CharUtil() {
+  }
+
   /**
    * Convenience method to create column type attributes for VARCHAR columns.
    * @param length the length.
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/DataGenerator.java b/java/kudu-client/src/main/java/org/apache/kudu/util/DataGenerator.java
index 07a11a2..b20010c 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/DataGenerator.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/DataGenerator.java
@@ -249,7 +249,4 @@ public class DataGenerator {
       );
     }
   }
-}
-
-
-
+}
\ No newline at end of file
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/DateUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/DateUtil.java
index af1c7d6..f71da3e 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/DateUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/DateUtil.java
@@ -29,6 +29,10 @@ public class DateUtil {
   public static final int MAX_DATE_VALUE =
       (int)LocalDate.parse("9999-12-31").toEpochDay(); // 2932896
 
+  /** Non-constructable utility class. */
+  private DateUtil() {
+  }
+
   /**
    * Check whether the date is within the range '0001-01-01':'9999-12-31'
    *
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/DecimalUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/DecimalUtil.java
index 83ec926..a3a9871 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/DecimalUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/DecimalUtil.java
@@ -49,6 +49,10 @@ public class DecimalUtil {
   public static final int MIN_DECIMAL_PRECISION = 1;
   public static final int MAX_DECIMAL_PRECISION = MAX_DECIMAL128_PRECISION;
 
+  /** Non-constructable utility class. */
+  private DecimalUtil() {
+  }
+
   /**
    * Given a precision, returns the size of the Decimal in Bytes.
    * @return the size in Bytes.
@@ -151,5 +155,4 @@ public class DecimalUtil {
         .scale(scale)
         .build();
   }
-
 }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/HashUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/HashUtil.java
index 9d27d4d..c2bfa20 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/HashUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/HashUtil.java
@@ -38,6 +38,10 @@ public class HashUtil {
     HASH_VAL_NULL_BYTE_BUF[3] = (byte) (HASH_VAL_NULL >>> 24);
   }
 
+  /** Non-constructable utility class. */
+  private HashUtil() {
+  }
+
   /**
    * Compute 64-bit FastHash of the supplied data backed by byte array.
    *
@@ -131,4 +135,4 @@ public class HashUtil {
     h ^= h >>> 47;
     return h;
   }
-}
+}
\ No newline at end of file
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/HybridTimeUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/HybridTimeUtil.java
index 4584ec7..0672a62 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/HybridTimeUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/HybridTimeUtil.java
@@ -30,6 +30,10 @@ public class HybridTimeUtil {
   public static final int hybridTimeNumBitsToShift = 12;
   public static final int hybridTimeLogicalBitsMask = (1 << hybridTimeNumBitsToShift) - 1;
 
+  /** Non-constructable utility class. */
+  private HybridTimeUtil() {
+  }
+
   /**
    * Converts the provided timestamp, in the provided unit, to the HybridTime timestamp
    * format. Logical bits are set to 0.
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
index 2da927a..26b1045 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
@@ -42,6 +42,10 @@ public class NetUtil {
 
   private static final Logger LOG = LoggerFactory.getLogger(NetUtil.class);
 
+  /** Non-constructable utility class. */
+  private NetUtil() {
+  }
+
   /**
    * Convert a list of {@link HostAndPort} objects to a comma separate string.
    * The inverse of {@link #parseStrings(String, int)}.
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/SchemaGenerator.java b/java/kudu-client/src/main/java/org/apache/kudu/util/SchemaGenerator.java
index ee248a0..6613b84 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/SchemaGenerator.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/SchemaGenerator.java
@@ -242,7 +242,7 @@ public class SchemaGenerator {
       default: throw new IllegalArgumentException("Unsupported type " + type);
     }
 
-    if (validEncodings.size() == 0) {
+    if (validEncodings.isEmpty()) {
       throw new IllegalArgumentException("There are no valid encodings for type " + type);
     }
 
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/StringUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/StringUtil.java
index 88bd436..fe2855d 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/StringUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/StringUtil.java
@@ -22,6 +22,10 @@ import org.apache.yetus.audience.InterfaceAudience;
 @InterfaceAudience.Private
 public class StringUtil {
 
+  /** Non-constructable utility class. */
+  private StringUtil() {
+  }
+
   /**
    * Escapes the provided string and appends it to the string builder. The
    * escaping is done according to the Hive/Impala escaping rules. Adapted from
@@ -84,8 +88,4 @@ public class StringUtil {
       }
     }
   }
-
-  /** Non-constructable utility class. */
-  private StringUtil() {
-  }
 }
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/TimestampUtil.java b/java/kudu-client/src/main/java/org/apache/kudu/util/TimestampUtil.java
index a6dde24..71d4053 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/TimestampUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/TimestampUtil.java
@@ -28,6 +28,10 @@ import org.apache.yetus.audience.InterfaceAudience;
 @InterfaceAudience.Private
 public class TimestampUtil {
 
+  /** Non-constructable utility class. */
+  private TimestampUtil() {
+  }
+
   // Thread local DateFormat since they're not thread-safe.
   private static final ThreadLocal<DateFormat> DATE_FORMAT = new ThreadLocal<DateFormat>() {
     @Override


[kudu] 02/02: [docs] minor update on the known issues

Posted by al...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit 3ac06337db360189539600ae4aa7c340a4ac8083
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Fri Jan 29 15:41:27 2021 -0800

    [docs] minor update on the known issues
    
    I was re-reading the Known Issues page at kudu.apache.org and noticed
    a few nits: this patch addresses those.
    
    Change-Id: Ifc2fd273d2a78442795f41b02dec4974e0221c51
    Reviewed-on: http://gerrit.cloudera.org:8080/17009
    Tested-by: Kudu Jenkins
    Reviewed-by: Grant Henke <gr...@apache.org>
---
 docs/known_issues.adoc | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/docs/known_issues.adoc b/docs/known_issues.adoc
index 203b195..3cdd719 100644
--- a/docs/known_issues.adoc
+++ b/docs/known_issues.adoc
@@ -46,7 +46,7 @@
 
 * Auto-generated primary keys are not supported.
 
-* Cells making up a composite primary key are limited to a total of 16KB after the internal
+* Cells making up a composite primary key are limited to a total of 16KiB after the internal
   composite-key encoding done by Kudu.
 
 === Columns
@@ -64,11 +64,14 @@
 
 * Tables must have an odd number of replicas, with a maximum of 7.
 
-* Replication factor (set at table creation time) cannot be changed.
+* The replication factor is set at table creation time and cannot be changed
+  later. As a workaround, create a new table with the same schema and
+  the desired replication factor and insert the contents of the old table
+  into the new one.
 
 === Cells (individual values)
 
-* Cells cannot be larger than 64KB before encoding or compression.
+* By default, cells cannot be larger than 64KiB before encoding or compression.
 
 === Other usage limitations
 
@@ -173,7 +176,7 @@ anecdotal values that have been seen in real world production clusters:
 
 * Server certificates generated by Kudu IPKI are incompatible with
   link:https://www.bouncycastle.org/[bouncycastle] version 1.52 and earlier. See
-  link:https://issues.apache.org/jira/browse/KUDU-2145[KUDU-2145] for details.'
+  link:https://issues.apache.org/jira/browse/KUDU-2145[KUDU-2145] for details.
 
 * The highest supported version of the TLS protocol is TLSv1.2