Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Update status to ACTIVE


IDIEP-82
Author
Sponsor
Created

 

Status

Status
colour

Grey

Green
title

DRAFT

Active


Table of Contents

Motivation

  • Users should be able to control thin client retry behavior in case of connection loss.
  • The API should be unified across all thin client implementations.

Description

  • Automatic reconnect on failure is present in all thin clients (see Thin clients features).
  • Java thin client also implements automatic operation retry. For example, if a cache.put() fails due to a connection issue, Ignite will try to establish a new connection (or use an existing one to another server), and execute cache.put() again. This behavior is dangerous for non-idempotent operations. In a case when the server completes an operation, but the connection fails during the response, the client will still retry the operation. For example, an SQL query that increments a column by 1 can be executed two or more times, leading to unexpected results.
  • Non-Java thin clients do not include automatic operation retry, so the users have to implement it like this:
Code Block
languagec#
titleUser-implemented retry logic
while (maxRetries-- > 0)
{
    try
    {
        cache.Put(1, "Hello");
        break;
    }
    catch (Exception e) when (e.GetBaseException() is SocketException)
    {
        // Retry.
    }
}

...

Summary

  • Java thin client has retry, but it can be dangerous and can't be fine-tuned.
  • Other thin client clients don't have retry and the user has to write cumbersome code.

Proposal

TODO: ClientRetryPolicy interface.

Risks and Assumptions

// Describe project risks, such as API or binary compatibility issues, major protocol changes, etc.

Discussion Links

// Links to discussions on the devlist, if applicable.

Reference Links

...

All changes are on the client side, server is not affected.

1. Add ClientConfiguration.retryPolicy property. By default, there is no retry.

2. Introduce ClientRetryPolicy interface


Code Block
languagejava
titleClientRetryPolicy.java
/**
 * Client retry policy determines whether client operations that have failed due to a connection issue should be retried.
 */
public interface ClientRetryPolicy {
    /**
     * Gets a value indicating whether a client operation that has failed due to a connection issue should be retried.
     *
     * @param client Ignite client instance.
     * @param operationType Operation type.
     * @param iteration Current iteration index (greater or equal to 0).
     * @param exception Exception that caused the operation to fail.
     * @return {@code true} if the operation should be retried on another connection, {@code false} otherwise.
     */
    public boolean shouldRetry(IgniteClient client, ClientOperationType operationType, int iteration, ClientConnectionException exception);
}


3. Provide predefined implementations, for example: ClientRetryAllPolicy, ClientRetryReadPolicy, ClientRetryIdempotentPolicy.


Usage example:

Code Block
languagejava
ClientConfiguration cfg = new ClientConfiguration()
        .setRetryPolicy(new ClientRetryReadPolicy());

Ignition.startClient(cfg);


Cross-Language Support

An interface is a good choice for Java and C# thin clients. For other languages, like C++ and Python, we may consider a different approach, such as a callback or a function pointer.

Risks and Assumptions

Ideally, we could pass more information to the shouldRetry method: cache keys and values, SQL query text, and so on, according to the operation at hand. However, this will require extra heap allocations - for every client method call, we'll need to store the arguments somewhere. This means overhead for the entire thin client API, which is not acceptable. We could also make this behavior optional with a property like ClientRetryPolicy.requiresArguments. For now, this is considered out of scope.

Discussion Links

Reference Links

Tickets

Tickets

Jira
serverASF JIRA
columnIdsissuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution
columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
maximumIssues20
jqlQuerylabels=iep-82
serverId5aa69414-a9e9-3523-82ec-879b028fb15b
// Links or report with relevant JIRA tickets.