Skip to content

Commit

Permalink
Fix compatibility with 1.10 and fix errors parsing #89
Browse files Browse the repository at this point in the history
  • Loading branch information
wey1and committed Jul 23, 2021
1 parent 5a4f770 commit aabbf37
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,20 +26,23 @@ public class TarantoolErrors {
private enum ErrorsCodes {
NO_CONNECTION("77"), TIMEOUT("78");
private final String code;

ErrorsCodes(String code) {
this.code = code;
}

public String getCode() {
return code;
}
}

private static final String CLIENT_ERROR = "ClientError";

/**
* Produces {@link TarantoolInternalException} subclasses
* from the serialized representation in the format of <code>require('errors').new_class("NewError")</code>,
* @see <a href="https://github.com/tarantool/errors">tarantool/errors</a>
*
* @see <a href="https://github.com/tarantool/errors">tarantool/errors</a>
*/
public static class TarantoolErrorsErrorFactory implements TarantoolErrorFactory {
private static final StringValue LINE = ValueFactory.newString("line");
Expand All @@ -49,12 +52,10 @@ public static class TarantoolErrorsErrorFactory implements TarantoolErrorFactory
private static final StringValue ERROR_MESSAGE = ValueFactory.newString("str");
private static final StringValue STACKTRACE = ValueFactory.newString("stack");
private static final Pattern NETWORK_ERROR_PATTERN = Pattern.compile(
".*" +
"\"code\":" +
"[" + ErrorsCodes.NO_CONNECTION.getCode() + "|" + ErrorsCodes.TIMEOUT.getCode() + "]" +
".*" +
"\"type\":\"" + CLIENT_ERROR + "\"" +
".*", Pattern.DOTALL);
"(?=.*\"type\":\"" + CLIENT_ERROR + "\")"
+ "(?=.*\"code\":"
+ "[" + ErrorsCodes.NO_CONNECTION.getCode() + "|" + ErrorsCodes.TIMEOUT.getCode() + "])",
Pattern.DOTALL);

public TarantoolErrorsErrorFactory() {
}
Expand All @@ -67,7 +68,7 @@ public Optional<TarantoolException> create(Value error) {
Map<Value, Value> map = error.asMapValue().map();

String exceptionMessage = "";
String errorMessage = map.containsKey(ERROR_MESSAGE) ? map.get(ERROR_MESSAGE).toString() : null;
String errorMessage = map.containsKey(ERROR_MESSAGE) ? map.get(ERROR_MESSAGE).toString() : null;
String err = map.containsKey(ERR) ? map.get(ERR).toString() : null;
String line = map.containsKey(LINE) ? map.get(LINE).toString() : null;
String className = map.containsKey(CLASS_NAME) ? map.get(CLASS_NAME).toString() : null;
Expand Down Expand Up @@ -133,8 +134,8 @@ private Boolean isErrorsError(String errorMessage) {
/**
* Produces {@link TarantoolInternalException} subclasses from the serialized representation
* in the format of <code>box.error:unpack</code>,
* @see <a href="https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_error/error/">box_error</a>
*
* @see <a href="https://www.tarantool.io/en/doc/latest/reference/reference_lua/box_error/error/">box_error</a>
*/
public static class TarantoolBoxErrorFactory implements TarantoolErrorFactory {
private static final StringValue CODE = ValueFactory.newString("code");
Expand Down Expand Up @@ -236,7 +237,7 @@ private Boolean isNetworkError(String code) {
/**
* Check the error message contains fields of code and message
*
* @param code code from box.error
* @param code code from box.error
* @param message string message from box.error
* @return an {@link Boolean}
*/
Expand All @@ -249,7 +250,6 @@ private Boolean isBoxError(String code, String message) {
* The factory is finalizing, i.e. errors passed into
* it will always be introverted as appropriate for the given factory
* The error is generated in a message that is passed to {@link TarantoolInternalException}
*
*/
public static class TarantoolUnrecognizedErrorFactory implements TarantoolErrorFactory {
public TarantoolUnrecognizedErrorFactory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ private ProxyTarantoolTupleClient setupClient() {
private RetryingTarantoolTupleClient setupRetryingClient(int retries) {
ProxyTarantoolTupleClient client = setupClient();
return new RetryingTarantoolTupleClient(client,
TarantoolRequestRetryPolicies
.byNumberOfAttempts(retries).build());
TarantoolRequestRetryPolicies
.byNumberOfAttempts(retries).build());
}

@Test
Expand All @@ -58,14 +58,13 @@ void testNetworkError_boxErrorUnpackNoConnection() {
client.callForSingleResult("box_error_unpack_no_connection", HashMap.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"code: 77\n" +
"message: Connection is not established\n" +
"base_type: ClientError\n" +
"type: ClientError\n" +
"trace:")
);
assertTrue(message.contains("code: 77"));
assertTrue(message.contains("message: Connection is not established"));
assertTrue(message.contains("type: ClientError"));
assertTrue(message.contains("trace:"));
}
}

Expand All @@ -80,14 +79,13 @@ void testNetworkError_boxErrorUnpackTimeout() {
String.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"code: 78\n" +
"message: Timeout exceeded\n" +
"base_type: ClientError\n" +
"type: ClientError\n" +
"trace:")
);
assertTrue(message.contains("code: 78"));
assertTrue(message.contains("message: Timeout exceeded"));
assertTrue(message.contains("type: ClientError"));
assertTrue(message.contains("trace:"));
}
}

Expand All @@ -102,12 +100,11 @@ void testNetworkError_boxErrorTimeout() {
String.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"InnerErrorMessage:\n" +
"code: 78\n" +
"message: Timeout exceeded")
);
assertTrue(message.contains("code: 78"));
assertTrue(message.contains("message: Timeout exceeded"));
}
}

Expand All @@ -119,13 +116,13 @@ void testNetworkError_crudErrorTimeout() {
client.callForSingleResult("crud_error_timeout", HashMap.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"Function returned an error: {\"code\":78," +
"\"base_type\":\"ClientError\"," +
"\"type\":\"ClientError\"," +
"\"message\":\"Timeout exceeded\","
));
assertTrue(message.contains("\"code\":78"));
assertTrue(message.contains("\"type\":\"ClientError\""));
assertTrue(message.contains("\"message\":\"Timeout exceeded\""));
assertTrue(message.contains("\"trace\":"));
}
}

Expand All @@ -137,33 +134,32 @@ void testNonNetworkError_boxErrorUnpack() {
client.callForSingleResult("box_error_non_network_error", HashMap.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalException);
assertFalse(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"code: 40\n" +
"message: Failed to write to disk\n" +
"base_type: ClientError\n" +
"type: ClientError\n" +
"trace:")
);
assertTrue(message.contains("code: 40"));
assertTrue(message.contains("message: Failed to write to disk"));
assertTrue(message.contains("type: ClientError"));
assertTrue(message.contains("trace:"));
}
}

@Test
void testNonNetworkError_boxError() {
try {
ProxyTarantoolTupleClient client = setupClient();

client.callForSingleResult("raising_error", HashMap.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
assertTrue(e.getCause() instanceof TarantoolInternalException);
assertFalse(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(e.getCause().getMessage().contains(
"InnerErrorMessage:\n" +
"code: 32\n" +
"message:")
);
}
@Test
void testNonNetworkError_boxError() {
try {
ProxyTarantoolTupleClient client = setupClient();

client.callForSingleResult("raising_error", HashMap.class).get();
fail("Exception must be thrown after last retry attempt.");
} catch (Throwable e) {
String message = e.getCause().getMessage();

assertTrue(e.getCause() instanceof TarantoolInternalException);
assertFalse(e.getCause() instanceof TarantoolInternalNetworkException);
assertTrue(message.contains("InnerErrorMessage:"));
assertTrue(message.contains("code: 32"));
assertTrue(message.contains("message:"));
}
}
}
6 changes: 5 additions & 1 deletion src/test/resources/cartridge/app/roles/api_router.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
local vshard = require('vshard')
local cartridge_rpc = require('cartridge.rpc')
local fiber = require('fiber')
local crud = require('crud')
local log = require('log')

local function get_schema()
Expand Down Expand Up @@ -113,7 +114,10 @@ local function box_error_non_network_error()
end

local function crud_error_timeout()
return crud.get("test_space", ('x'):rep(2^27))
return nil, { class_name = 'SelectError',
err = 'Failed to get next object: GetTupleError: Failed to get tuples from storages: UpdateTuplesError: Failed to select tuples from storages: Call: Failed for 07d14fec-f32b-4b90-aa72-e6755273ad56: Function returned an error: {\"code\":78,\"base_type\":\"ClientError\",\"type\":\"ClientError\",\"message\":\"Timeout exceeded\",\"trace\":[{\"file\":\"builtin\\/box\\/net_box.lua\",\"line\":419}]}',
str = 'SelectError: Failed to get next object: GetTupleError: Failed to get tuples from storages: UpdateTuplesError: Failed to select tuples from storages: Call: Failed for 07d14fec-f32b-4b90-aa72-e6755273ad56: Function returned an error: {\"code\":78,\"base_type\":\"ClientError\",\"type\":\"ClientError\",\"message\":\"Timeout exceeded\",\"trace\":[{\"file\":\"builtin\\/box\\/net_box.lua\",\"line\":419}]}'
}
end

local function init(opts)
Expand Down

0 comments on commit aabbf37

Please sign in to comment.