Skip to content

Question: How to handle error thrown by TiKV #9

Open
@JaySon-Huang

Description

@JaySon-Huang
## Setup a cluster by TiUP playground
client-cpp>  tiup playground --nightly

## Then run the example program of `tikv/client-cpp`
client-cpp> make run-example
RUST_LOG=debug /data3/my/client-cpp/target/tikv-example
[2021-03-02T14:29:15Z INFO  tikv_client_common::security] connect to rpc server at endpoint: "127.0.0.1:2379"
[2021-03-02T14:29:15Z WARN  tikv_client_pd::cluster] PD endpoint 127.0.0.1:2379 failed to respond: Grpc(RpcFailure(RpcStatus { status: 14-UNAVAILABLE, details: Some("failed to connect to all addresses") }))
terminate called after throwing an instance of 'rust::cxxbridge1::Error'
  what():  [/root/.cargo/git/checkouts/client-rust-5a1ccd35a54db20f/89ac804/tikv-client-pd/src/cluster.rs:174]: PD cluster failed to respond
make: *** [run-example] Aborted

client-cpp>  make run-example
RUST_LOG=debug /data3/my/client-cpp/target/tikv-example
[2021-03-02T14:30:34Z INFO  tikv_client_common::security] connect to rpc server at endpoint: "127.0.0.1:2379"
[2021-03-02T14:30:34Z INFO  tikv_client_pd::cluster] All PD endpoints are consistent: ["127.0.0.1:2379"]
[2021-03-02T14:30:34Z INFO  tikv_client_common::security] connect to rpc server at endpoint: "http://127.0.0.1:2379"
[2021-03-02T14:30:34Z INFO  tikv_client_common::security] connect to rpc server at endpoint: "http://127.0.0.1:2379"
get key k1:v2
terminate called after throwing an instance of 'rust::cxxbridge1::Error'
  what():  Leader of region 2 is not found
make: *** [run-example] Aborted

I try to run the example program while setting up a tiup-playground cluster, it throws some errors.

For example, if I want to write some code to handle leader not found error, now I have to write it like

    auto txn = client.begin();

    txn.put("k1", "v2");

    bool success = false;
    while (!success) {
        try {
            txn.commit();
            success = true;
        } catch (rust::cxxbridge1::Error &e) {
            // Ignore Leader not found and try to commit again
            std::string err_msg = e.what();
            if (err_msg.find("Leader of region") == std::string::npos) {
                // Other error, throw exception
                throw;
            }
        }
    }

Can client-cpp throw different kind of Exception? So I can write codes like:

    auto txn = client.begin();

    txn.put("k1", "v2");

    bool success = false;
    while (!success) {
        try {
            txn.commit();
            success = true;
        } catch (tikv_client::LeaderNotFoundException &e) {
            // Ignore Leader not found and try to commit again
        }
    }

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requesthelp wantedExtra attention is needed

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions