You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2021/12/27 16:53:58 UTC

[ignite-3] branch main updated: IGNITE-16117 Thin client: Convert async exceptions in sync APIs (#525)

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

ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new ca29c42  IGNITE-16117 Thin client: Convert async exceptions in sync APIs (#525)
ca29c42 is described below

commit ca29c426e742c221c7eb961b2520d26d3a33ef43
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Mon Dec 27 19:53:52 2021 +0300

    IGNITE-16117 Thin client: Convert async exceptions in sync APIs (#525)
---
 .../org/apache/ignite/client/IgniteClient.java     |  3 +-
 .../apache/ignite/internal/client/ClientUtils.java | 62 ++++++++++++++++++++++
 .../client/table/ClientKeyValueBinaryView.java     | 30 ++++++-----
 .../internal/client/table/ClientKeyValueView.java  | 29 +++++-----
 .../client/table/ClientRecordBinaryView.java       | 32 +++++------
 .../internal/client/table/ClientRecordView.java    | 32 +++++------
 .../ignite/internal/client/table/ClientTables.java | 12 +++--
 .../internal/client/tx/ClientTransaction.java      |  6 ++-
 .../internal/client/tx/ClientTransactions.java     |  4 +-
 .../client/ClientKeyValueBinaryViewTest.java       |  3 +-
 .../ignite/client/ClientKeyValueViewTest.java      |  6 +--
 .../apache/ignite/client/ClientRecordViewTest.java |  6 +--
 .../org/apache/ignite/client/ClientTableTest.java  |  7 ++-
 .../org/apache/ignite/client/ReconnectTest.java    |  5 +-
 .../app/client/ItThinClientTransactionsTest.java   | 14 +++--
 15 files changed, 159 insertions(+), 92 deletions(-)

diff --git a/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java b/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java
index 503c0ce..034976b 100644
--- a/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java
+++ b/modules/client/src/main/java/org/apache/ignite/client/IgniteClient.java
@@ -21,6 +21,7 @@ import static org.apache.ignite.client.IgniteClientConfiguration.DFLT_CONNECT_TI
 import static org.apache.ignite.client.IgniteClientConfiguration.DFLT_RECONNECT_THROTTLING_PERIOD;
 import static org.apache.ignite.client.IgniteClientConfiguration.DFLT_RECONNECT_THROTTLING_RETRIES;
 import static org.apache.ignite.client.IgniteClientConfiguration.DFLT_RETRY_LIMIT;
+import static org.apache.ignite.internal.client.ClientUtils.sync;
 
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
@@ -171,7 +172,7 @@ public interface IgniteClient extends Ignite {
          * @return Ignite client.
          */
         public IgniteClient build() {
-            return buildAsync().join();
+            return sync(buildAsync());
         }
 
         /**
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java
new file mode 100644
index 0000000..562c9ba
--- /dev/null
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientUtils.java
@@ -0,0 +1,62 @@
+/*
+ * 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.ignite.internal.client;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import org.apache.ignite.client.IgniteClientException;
+import org.apache.ignite.lang.IgniteException;
+
+/**
+ * Client utilities.
+ */
+public class ClientUtils {
+    /**
+     * Waits for async operation completion.
+     *
+     * @param fut Future to wait to.
+     * @param <T> Future result type.
+     * @return Future result.
+     */
+    public static <T> T sync(CompletableFuture<T> fut) {
+        try {
+            return fut.get();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt(); // Restore interrupt flag.
+
+            throw convertException(e);
+        } catch (ExecutionException e) {
+            throw convertException(e.getCause());
+        }
+    }
+
+    /**
+     * Converts an internal exception to a public one.
+     *
+     * @param e Internal exception.
+     * @return Public exception.
+     */
+    public static IgniteException convertException(Throwable e) {
+        if (e instanceof IgniteException) {
+            return (IgniteException) e;
+        }
+
+        //TODO: IGNITE-14500 Replace with public exception with an error code (or unwrap?).
+        return new IgniteClientException(e.getMessage(), e);
+    }
+}
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
index 4b19ec5..c39c7ff 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
@@ -57,7 +59,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple get(@Nullable Transaction tx, @NotNull Tuple key) {
-        return getAsync(tx, key).join();
+        return sync(getAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -74,7 +76,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Map<Tuple, Tuple> getAll(@Nullable Transaction tx, @NotNull Collection<Tuple> keys) {
-        return getAllAsync(tx, keys).join();
+        return sync(getAllAsync(tx, keys));
     }
 
     /** {@inheritDoc} */
@@ -92,7 +94,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean contains(@Nullable Transaction tx, @NotNull Tuple key) {
-        return containsAsync(tx, key).join();
+        return sync(containsAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -109,7 +111,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public void put(@Nullable Transaction tx, @NotNull Tuple key, Tuple val) {
-        putAsync(tx, key, val).join();
+        sync(putAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -128,7 +130,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public void putAll(@Nullable Transaction tx, @NotNull Map<Tuple, Tuple> pairs) {
-        putAllAsync(tx, pairs).join();
+        sync(putAllAsync(tx, pairs));
     }
 
     /** {@inheritDoc} */
@@ -145,7 +147,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndPut(@Nullable Transaction tx, @NotNull Tuple key, Tuple val) {
-        return getAndPutAsync(tx, key, val).join();
+        return sync(getAndPutAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -162,7 +164,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean putIfAbsent(@Nullable Transaction tx, @NotNull Tuple key, @NotNull Tuple val) {
-        return putIfAbsentAsync(tx, key, val).join();
+        return sync(putIfAbsentAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -179,13 +181,13 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean remove(@Nullable Transaction tx, @NotNull Tuple key) {
-        return removeAsync(tx, key).join();
+        return sync(removeAsync(tx, key));
     }
 
     /** {@inheritDoc} */
     @Override
     public boolean remove(@Nullable Transaction tx, @NotNull Tuple key, @NotNull Tuple val) {
-        return removeAsync(tx, key, val).join();
+        return sync(removeAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -214,7 +216,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Collection<Tuple> removeAll(@Nullable Transaction tx, @NotNull Collection<Tuple> keys) {
-        return removeAllAsync(tx, keys).join();
+        return sync(removeAllAsync(tx, keys));
     }
 
     /** {@inheritDoc} */
@@ -232,7 +234,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndRemove(@Nullable Transaction tx, @NotNull Tuple key) {
-        return getAndRemoveAsync(tx, key).join();
+        return sync(getAndRemoveAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -249,13 +251,13 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull Tuple key, Tuple val) {
-        return replaceAsync(tx, key, val).join();
+        return sync(replaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull Tuple key, Tuple oldVal, Tuple newVal) {
-        return replaceAsync(tx, key, oldVal, newVal).join();
+        return sync(replaceAsync(tx, key, oldVal, newVal));
     }
 
     /** {@inheritDoc} */
@@ -286,7 +288,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndReplace(@Nullable Transaction tx, @NotNull Tuple key, Tuple val) {
-        return getAndReplaceAsync(tx, key, val).join();
+        return sync(getAndReplaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
index 8e4fc3b..2f8e78a 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
 import static org.apache.ignite.internal.client.table.ClientTable.writeTx;
 
 import java.io.Serializable;
@@ -77,7 +78,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public V get(@Nullable Transaction tx, @NotNull K key) {
-        return getAsync(tx, key).join();
+        return sync(getAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -94,7 +95,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public Map<K, V> getAll(@Nullable Transaction tx, @NotNull Collection<K> keys) {
-        return getAllAsync(tx, keys).join();
+        return sync(getAllAsync(tx, keys));
     }
 
     /** {@inheritDoc} */
@@ -116,7 +117,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public boolean contains(@Nullable Transaction tx, @NotNull K key) {
-        return containsAsync(tx, key).join();
+        return sync(containsAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -133,7 +134,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public void put(@Nullable Transaction tx, @NotNull K key, V val) {
-        putAsync(tx, key, val).join();
+        sync(putAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -150,7 +151,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public void putAll(@Nullable Transaction tx, @NotNull Map<K, V> pairs) {
-        putAllAsync(tx, pairs).join();
+        sync(putAllAsync(tx, pairs));
     }
 
     /** {@inheritDoc} */
@@ -181,7 +182,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public V getAndPut(@Nullable Transaction tx, @NotNull K key, V val) {
-        return getAndPutAsync(tx, key, val).join();
+        return sync(getAndPutAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -198,7 +199,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public boolean putIfAbsent(@Nullable Transaction tx, @NotNull K key, @NotNull V val) {
-        return putIfAbsentAsync(tx, key, val).join();
+        return sync(putIfAbsentAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -215,13 +216,13 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public boolean remove(@Nullable Transaction tx, @NotNull K key) {
-        return removeAsync(tx, key).join();
+        return sync(removeAsync(tx, key));
     }
 
     /** {@inheritDoc} */
     @Override
     public boolean remove(@Nullable Transaction tx, @NotNull K key, V val) {
-        return removeAsync(tx, key, val).join();
+        return sync(removeAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -249,7 +250,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public Collection<K> removeAll(@Nullable Transaction tx, @NotNull Collection<K> keys) {
-        return removeAllAsync(tx, keys).join();
+        return sync(removeAllAsync(tx, keys));
     }
 
     /** {@inheritDoc} */
@@ -271,7 +272,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public V getAndRemove(@Nullable Transaction tx, @NotNull K key) {
-        return getAndRemoveAsync(tx, key).join();
+        return sync(getAndRemoveAsync(tx, key));
     }
 
     /** {@inheritDoc} */
@@ -288,7 +289,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull K key, V val) {
-        return replaceAsync(tx, key, val).join();
+        return sync(replaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
@@ -296,7 +297,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     public boolean replace(@Nullable Transaction tx, @NotNull K key, V oldVal, V newVal) {
         Objects.requireNonNull(key);
 
-        return replaceAsync(tx, key, oldVal, newVal).join();
+        return sync(replaceAsync(tx, key, oldVal, newVal));
     }
 
     /** {@inheritDoc} */
@@ -330,7 +331,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
     /** {@inheritDoc} */
     @Override
     public V getAndReplace(@Nullable Transaction tx, @NotNull K key, V val) {
-        return getAndReplaceAsync(tx, key, val).join();
+        return sync(getAndReplaceAsync(tx, key, val));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
index a1b1c55..413d244 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
@@ -57,7 +59,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple get(@Nullable Transaction tx, @NotNull Tuple keyRec) {
-        return getAsync(tx, keyRec).join();
+        return sync(getAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -74,7 +76,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Collection<Tuple> getAll(@Nullable Transaction tx, @NotNull Collection<Tuple> keyRecs) {
-        return getAllAsync(tx, keyRecs).join();
+        return sync(getAllAsync(tx, keyRecs));
     }
 
     /** {@inheritDoc} */
@@ -92,7 +94,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public void upsert(@Nullable Transaction tx, @NotNull Tuple rec) {
-        upsertAsync(tx, rec).join();
+        sync(upsertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -110,7 +112,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public void upsertAll(@Nullable Transaction tx, @NotNull Collection<Tuple> recs) {
-        upsertAllAsync(tx, recs).join();
+        sync(upsertAllAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
@@ -127,7 +129,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndUpsert(@Nullable Transaction tx, @NotNull Tuple rec) {
-        return getAndUpsertAsync(tx, rec).join();
+        return sync(getAndUpsertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -144,7 +146,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean insert(@Nullable Transaction tx, @NotNull Tuple rec) {
-        return insertAsync(tx, rec).join();
+        return sync(insertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -161,7 +163,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Collection<Tuple> insertAll(@Nullable Transaction tx, @NotNull Collection<Tuple> recs) {
-        return insertAllAsync(tx, recs).join();
+        return sync(insertAllAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
@@ -179,13 +181,13 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull Tuple rec) {
-        return replaceAsync(tx, rec).join();
+        return sync(replaceAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull Tuple oldRec, @NotNull Tuple newRec) {
-        return replaceAsync(tx, oldRec, newRec).join();
+        return sync(replaceAsync(tx, oldRec, newRec));
     }
 
     /** {@inheritDoc} */
@@ -217,7 +219,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndReplace(@Nullable Transaction tx, @NotNull Tuple rec) {
-        return getAndReplaceAsync(tx, rec).join();
+        return sync(getAndReplaceAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -234,7 +236,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean delete(@Nullable Transaction tx, @NotNull Tuple keyRec) {
-        return deleteAsync(tx, keyRec).join();
+        return sync(deleteAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -251,7 +253,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public boolean deleteExact(@Nullable Transaction tx, @NotNull Tuple rec) {
-        return deleteExactAsync(tx, rec).join();
+        return sync(deleteExactAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -268,7 +270,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Tuple getAndDelete(@Nullable Transaction tx, @NotNull Tuple keyRec) {
-        return getAndDeleteAsync(tx, keyRec).join();
+        return sync(getAndDeleteAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -285,7 +287,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Collection<Tuple> deleteAll(@Nullable Transaction tx, @NotNull Collection<Tuple> keyRecs) {
-        return deleteAllAsync(tx, keyRecs).join();
+        return sync(deleteAllAsync(tx, keyRecs));
     }
 
     /** {@inheritDoc} */
@@ -303,7 +305,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
     /** {@inheritDoc} */
     @Override
     public Collection<Tuple> deleteAllExact(@Nullable Transaction tx, @NotNull Collection<Tuple> recs) {
-        return deleteAllExactAsync(tx, recs).join();
+        return sync(deleteAllExactAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
index ff590fa..8681e56 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.Collections;
@@ -57,7 +59,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public R get(@Nullable Transaction tx, @NotNull R keyRec) {
-        return getAsync(tx, keyRec).join();
+        return sync(getAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -74,7 +76,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public Collection<R> getAll(@Nullable Transaction tx, @NotNull Collection<R> keyRecs) {
-        return getAllAsync(tx, keyRecs).join();
+        return sync(getAllAsync(tx, keyRecs));
     }
 
     /** {@inheritDoc} */
@@ -92,7 +94,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public void upsert(@Nullable Transaction tx, @NotNull R rec) {
-        upsertAsync(tx, rec).join();
+        sync(upsertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -109,7 +111,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public void upsertAll(@Nullable Transaction tx, @NotNull Collection<R> recs) {
-        upsertAllAsync(tx, recs).join();
+        sync(upsertAllAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
@@ -126,7 +128,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public R getAndUpsert(@Nullable Transaction tx, @NotNull R rec) {
-        return getAndUpsertAsync(tx, rec).join();
+        return sync(getAndUpsertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -143,7 +145,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public boolean insert(@Nullable Transaction tx, @NotNull R rec) {
-        return insertAsync(tx, rec).join();
+        return sync(insertAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -160,7 +162,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public Collection<R> insertAll(@Nullable Transaction tx, @NotNull Collection<R> recs) {
-        return insertAllAsync(tx, recs).join();
+        return sync(insertAllAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
@@ -178,13 +180,13 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull R rec) {
-        return replaceAsync(tx, rec).join();
+        return sync(replaceAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
     @Override
     public boolean replace(@Nullable Transaction tx, @NotNull R oldRec, @NotNull R newRec) {
-        return replaceAsync(tx, oldRec, newRec).join();
+        return sync(replaceAsync(tx, oldRec, newRec));
     }
 
     /** {@inheritDoc} */
@@ -213,7 +215,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public R getAndReplace(@Nullable Transaction tx, @NotNull R rec) {
-        return getAndReplaceAsync(tx, rec).join();
+        return sync(getAndReplaceAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -230,7 +232,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public boolean delete(@Nullable Transaction tx, @NotNull R keyRec) {
-        return deleteAsync(tx, keyRec).join();
+        return sync(deleteAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -247,7 +249,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public boolean deleteExact(@Nullable Transaction tx, @NotNull R rec) {
-        return deleteExactAsync(tx, rec).join();
+        return sync(deleteExactAsync(tx, rec));
     }
 
     /** {@inheritDoc} */
@@ -264,7 +266,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public R getAndDelete(@Nullable Transaction tx, @NotNull R keyRec) {
-        return getAndDeleteAsync(tx, keyRec).join();
+        return sync(getAndDeleteAsync(tx, keyRec));
     }
 
     /** {@inheritDoc} */
@@ -281,7 +283,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public Collection<R> deleteAll(@Nullable Transaction tx, @NotNull Collection<R> keyRecs) {
-        return deleteAllAsync(tx, keyRecs).join();
+        return sync(deleteAllAsync(tx, keyRecs));
     }
 
     /** {@inheritDoc} */
@@ -299,7 +301,7 @@ public class ClientRecordView<R> implements RecordView<R> {
     /** {@inheritDoc} */
     @Override
     public Collection<R> deleteAllExact(@Nullable Transaction tx, @NotNull Collection<R> recs) {
-        return deleteAllExactAsync(tx, recs).join();
+        return sync(deleteAllExactAsync(tx, recs));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
index 3a5a7a5..df9981a 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTables.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -46,7 +48,7 @@ public class ClientTables implements IgniteTables {
     /** {@inheritDoc} */
     @Override
     public Table createTable(String name, Consumer<TableChange> tableInitChange) {
-        return createTableAsync(name, tableInitChange).join();
+        return sync(createTableAsync(name, tableInitChange));
     }
 
     /** {@inheritDoc} */
@@ -61,7 +63,7 @@ public class ClientTables implements IgniteTables {
     /** {@inheritDoc} */
     @Override
     public void alterTable(String name, Consumer<TableChange> tableChange) {
-        alterTableAsync(name, tableChange).join();
+        sync(alterTableAsync(name, tableChange));
     }
 
     /** {@inheritDoc} */
@@ -76,7 +78,7 @@ public class ClientTables implements IgniteTables {
     /** {@inheritDoc} */
     @Override
     public void dropTable(String name) {
-        dropTableAsync(name).join();
+        sync(dropTableAsync(name));
     }
 
     /** {@inheritDoc} */
@@ -90,7 +92,7 @@ public class ClientTables implements IgniteTables {
     /** {@inheritDoc} */
     @Override
     public List<Table> tables() {
-        return tablesAsync().join();
+        return sync(tablesAsync());
     }
 
     /** {@inheritDoc} */
@@ -112,7 +114,7 @@ public class ClientTables implements IgniteTables {
     /** {@inheritDoc} */
     @Override
     public Table table(String name) {
-        return tableAsync(name).join();
+        return sync(tableAsync(name));
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransaction.java b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransaction.java
index c9b4f42..db90c8a 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransaction.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransaction.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.tx;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.internal.client.ClientChannel;
@@ -78,7 +80,7 @@ public class ClientTransaction implements Transaction {
     /** {@inheritDoc} */
     @Override
     public void commit() throws TransactionException {
-        commitAsync().join();
+        sync(commitAsync());
     }
 
     /** {@inheritDoc} */
@@ -92,7 +94,7 @@ public class ClientTransaction implements Transaction {
     /** {@inheritDoc} */
     @Override
     public void rollback() throws TransactionException {
-        rollbackAsync().join();
+        sync(rollbackAsync());
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransactions.java b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransactions.java
index 3c0f074..4fd8552 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransactions.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/tx/ClientTransactions.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client.tx;
 
+import static org.apache.ignite.internal.client.ClientUtils.sync;
+
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.client.ReliableChannel;
 import org.apache.ignite.internal.client.proto.ClientOp;
@@ -49,7 +51,7 @@ public class ClientTransactions implements IgniteTransactions {
     /** {@inheritDoc} */
     @Override
     public Transaction begin() {
-        return beginAsync().join();
+        return sync(beginAsync());
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
index 8927317..c8b6d73 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueBinaryViewTest.java
@@ -27,7 +27,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.table.Tuple;
@@ -172,7 +171,7 @@ public class ClientKeyValueBinaryViewTest extends AbstractClientTableTest {
     public void testContainsThrowsOnEmptyKey() {
         KeyValueView<Tuple, Tuple> kvView = defaultTable().keyValueView();
 
-        var ex = assertThrows(CompletionException.class, () -> kvView.contains(null, Tuple.create()));
+        var ex = assertThrows(IgniteClientException.class, () -> kvView.contains(null, Tuple.create()));
         assertTrue(ex.getMessage().contains("Missed key column: id"), ex.getMessage());
     }
 
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java
index 92719e6..65b7acd 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientKeyValueViewTest.java
@@ -31,7 +31,6 @@ import java.util.BitSet;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
@@ -192,10 +191,9 @@ public class ClientKeyValueViewTest extends AbstractClientTableTest {
     public void testMissingKeyColumnThrowsException() {
         var kvView = defaultTable().keyValueView(NamePojo.class, NamePojo.class);
 
-        CompletionException e = assertThrows(CompletionException.class, () -> kvView.get(null, new NamePojo()));
-        IgniteClientException ice = (IgniteClientException) e.getCause();
+        IgniteClientException e = assertThrows(IgniteClientException.class, () -> kvView.get(null, new NamePojo()));
 
-        assertEquals("No field found for column id", ice.getMessage());
+        assertEquals("No field found for column id", e.getMessage());
     }
 
     @Test
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientRecordViewTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientRecordViewTest.java
index 2d3c885..95a9075 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientRecordViewTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientRecordViewTest.java
@@ -30,7 +30,6 @@ import java.math.BigInteger;
 import java.util.BitSet;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.table.KeyValueView;
 import org.apache.ignite.table.RecordView;
 import org.apache.ignite.table.Table;
@@ -190,10 +189,9 @@ public class ClientRecordViewTest extends AbstractClientTableTest {
     public void testMissingKeyColumnThrowsException() {
         RecordView<NamePojo> recordView = defaultTable().recordView(NamePojo.class);
 
-        CompletionException e = assertThrows(CompletionException.class, () -> recordView.get(null, new NamePojo()));
-        IgniteClientException ice = (IgniteClientException) e.getCause();
+        IgniteClientException e = assertThrows(IgniteClientException.class, () -> recordView.get(null, new NamePojo()));
 
-        assertEquals("No field found for column id", ice.getMessage());
+        assertEquals("No field found for column id", e.getMessage());
     }
 
     @Test
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java b/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
index a7ad4a3..738bb42 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ClientTableTest.java
@@ -26,7 +26,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.client.fakes.FakeSchemaRegistry;
 import org.apache.ignite.internal.client.table.ClientTuple;
 import org.apache.ignite.table.RecordView;
@@ -45,7 +44,7 @@ public class ClientTableTest extends AbstractClientTableTest {
 
         var key = Tuple.create().set("name", "123");
 
-        var ex = assertThrows(CompletionException.class, () -> table.get(null, key));
+        var ex = assertThrows(IgniteClientException.class, () -> table.get(null, key));
 
         assertTrue(ex.getMessage().contains("Missed key column: id"),
                 ex.getMessage());
@@ -369,7 +368,7 @@ public class ClientTableTest extends AbstractClientTableTest {
                 .set("id", 1)
                 .set("str_non_null", null);
 
-        var ex = assertThrows(CompletionException.class, () -> table.upsert(null, tuple));
+        var ex = assertThrows(IgniteClientException.class, () -> table.upsert(null, tuple));
 
         assertTrue(ex.getMessage().contains("null was passed, but column is not nullable"), ex.getMessage());
     }
@@ -378,7 +377,7 @@ public class ClientTableTest extends AbstractClientTableTest {
     public void testColumnTypeMismatchThrowsException() {
         var tuple = Tuple.create().set("id", "str");
 
-        var ex = assertThrows(CompletionException.class, () -> defaultTable().recordView().upsert(null, tuple));
+        var ex = assertThrows(IgniteClientException.class, () -> defaultTable().recordView().upsert(null, tuple));
 
         assertTrue(ex.getMessage().contains("Incorrect value type for column 'id': Expected Integer, but got String"), ex.getMessage());
     }
diff --git a/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java b/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
index fe8793b..55ffcee 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/ReconnectTest.java
@@ -20,7 +20,6 @@ package org.apache.ignite.client;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.client.fakes.FakeIgnite;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.junit.jupiter.api.AfterEach;
@@ -90,7 +89,7 @@ public class ReconnectTest {
 
         server.close();
 
-        var ex = assertThrows(CompletionException.class, () -> client.tables().tables());
-        assertEquals(ex.getCause().getMessage(), "Channel is closed");
+        var ex = assertThrows(IgniteClientConnectionException.class, () -> client.tables().tables());
+        assertEquals(ex.getMessage(), "Channel is closed");
     }
 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
index f157f46..6fc6056 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/client/ItThinClientTransactionsTest.java
@@ -29,7 +29,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
 import org.apache.ignite.client.IgniteClient;
 import org.apache.ignite.client.IgniteClientException;
 import org.apache.ignite.table.KeyValueView;
@@ -191,8 +190,8 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest {
         Transaction tx = client().transactions().begin();
         kvView.put(tx, -100, "1");
 
-        var ex = assertThrows(CompletionException.class, () -> kvView.get(null, -100));
-        assertThat(ex.getCause().getMessage(), containsString("TimeoutException"));
+        IgniteClientException ex = assertThrows(IgniteClientException.class, () -> kvView.get(null, -100));
+        assertThat(ex.getMessage(), containsString("TimeoutException"));
 
         tx.rollback();
     }
@@ -237,12 +236,12 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest {
             }
         };
 
-        var ex = assertThrows(CompletionException.class, () -> kvView().put(tx, 1, "1"));
+        var ex = assertThrows(IgniteClientException.class, () -> kvView().put(tx, 1, "1"));
 
         String expected = "Unsupported transaction implementation: "
                 + "'class org.apache.ignite.internal.runner.app.client.ItThinClientTransactionsTest";
 
-        assertThat(ex.getCause().getMessage(), startsWith(expected));
+        assertThat(ex.getMessage(), startsWith(expected));
     }
 
     @Test
@@ -252,10 +251,9 @@ public class ItThinClientTransactionsTest extends ItAbstractThinClientTest {
         try (IgniteClient client2 = IgniteClient.builder().addresses(getNodeAddress()).build()) {
             RecordView<Tuple> recordView = client2.tables().tables().get(0).recordView();
 
-            var ex = assertThrows(CompletionException.class, () -> recordView.upsert(tx, Tuple.create()));
-            var iex = (IgniteClientException) ex.getCause();
+            IgniteClientException ex = assertThrows(IgniteClientException.class, () -> recordView.upsert(tx, Tuple.create()));
 
-            assertEquals("Transaction context has been lost due to connection errors.", iex.getMessage());
+            assertEquals("Transaction context has been lost due to connection errors.", ex.getMessage());
         }
     }