diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs
index fc056c83525a01ec603638c9022c98cab26d1e89..70c354c8e523fb5766319a70c46745721e7f5528 100644
--- a/src/plugin/mod.rs
+++ b/src/plugin/mod.rs
@@ -397,12 +397,11 @@ fn do_routing_table_cas(
                 node.wait_index(index, deadline.duration_since(fiber::clock()))?;
                 if term != raft::Storage::term(raft_storage, index)? {
                     // leader switched - retry
-                    node.wait_status();
                     continue;
                 }
             }
             Err(err) => {
-                if err.is_cas_err() || err.is_term_mismatch_err() {
+                if err.is_retriable() {
                     // cas error - retry
                     fiber::sleep(Duration::from_millis(500));
                     continue;
@@ -514,12 +513,11 @@ fn do_plugin_cas(
                 node.wait_index(index, deadline.duration_since(Instant::now_fiber()))?;
                 if term != raft::Storage::term(raft_storage, index)? {
                     // leader switched - retry
-                    node.wait_status();
                     continue;
                 }
             }
             Err(err) => {
-                if err.is_cas_err() | err.is_term_mismatch_err() {
+                if err.is_retriable() {
                     // cas error - retry
                     fiber::sleep(Duration::from_millis(500));
                     continue;
diff --git a/src/rpc/join.rs b/src/rpc/join.rs
index 6fa9f89ba06f20b1a0c60205307123c8bd75dd3d..ae090f30338f689eb4983dc558588671a90b65eb 100644
--- a/src/rpc/join.rs
+++ b/src/rpc/join.rs
@@ -135,12 +135,11 @@ pub fn handle_join_request_and_wait(req: Request, timeout: Duration) -> Result<R
                 node.wait_index(index, deadline.duration_since(fiber::clock()))?;
                 if term != raft::Storage::term(raft_storage, index)? {
                     // leader switched - retry
-                    node.wait_status();
                     continue;
                 }
             }
             Err(err) => {
-                if err.is_cas_err() | err.is_term_mismatch_err() {
+                if err.is_retriable() {
                     // cas error - retry
                     fiber::sleep(Duration::from_millis(500));
                     continue;
diff --git a/src/rpc/update_instance.rs b/src/rpc/update_instance.rs
index 5f3b5e9bf82e05f2b40d11e07bd1d3ad525ff069..4c970a56ba27a0fc64193dc29b11cb981a314129 100644
--- a/src/rpc/update_instance.rs
+++ b/src/rpc/update_instance.rs
@@ -181,7 +181,6 @@ pub fn handle_update_instance_request_in_governor_and_also_wait_too(
                 node.wait_index(index, deadline.duration_since(fiber::clock()))?;
                 if term != raft::Storage::term(raft_storage, index)? {
                     // leader switched - retry
-                    node.wait_status();
                     continue;
                 }
             }
@@ -189,7 +188,7 @@ pub fn handle_update_instance_request_in_governor_and_also_wait_too(
                 if req.dont_retry {
                     return Err(err);
                 }
-                if err.is_cas_err() || err.is_term_mismatch_err() {
+                if err.is_retriable() {
                     // cas error - retry
                     fiber::sleep(Duration::from_millis(500));
                     continue;
diff --git a/src/schema.rs b/src/schema.rs
index 1e88fb92b2622d39a6866df8850529bfb24f05b2..e7c56108da13c507b75137e9e571fff22b045a2f 100644
--- a/src/schema.rs
+++ b/src/schema.rs
@@ -2469,6 +2469,7 @@ pub fn abort_ddl(timeout: Duration) -> traft::Result<RaftIndex> {
         };
 
         let req = Request::new(Op::DdlAbort, predicate, effective_user_id())?;
+        // FIXME: this error handling is wrong, must retry if e.is_retriable()
         let (index, term) = compare_and_swap(&req, timeout)?;
         node.wait_index(index, timeout)?;
         if raft::Storage::term(&node.raft_storage, index)? != term {
diff --git a/src/traft/error.rs b/src/traft/error.rs
index 02e7028a8c169f21615a2d9be602418924c9e333..860bbe2514f7f7689cc7cdc9cf8ed7b07d8f9ff8 100644
--- a/src/traft/error.rs
+++ b/src/traft/error.rs
@@ -150,7 +150,9 @@ pub fn is_retriable_error_message(msg: &str) -> bool {
     }
 
     if msg.contains("compare-and-swap") {
-        return msg.contains("Compacted") || msg.contains("ConflictFound");
+        return msg.contains("Compacted")
+            || msg.contains("ConflictFound")
+            || msg.contains("EntryTermMismatch");
     }
 
     return false;