Repository: alibaba/GraphScope (language: python)

Issue:
Proposal of the error handling
Including: 
- StatusCode (ErrorCode) and error reporting format;
- Integration with otlp;
- logging format and how to find the corresponding log part for a specific query/graph operation/algorithm...


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/build-graphscope-dev-images.yml b/.github/workflows/build-graphscope-dev-images.yml
index 569448ff33d1..c47810203b8a 100644
--- a/.github/workflows/build-graphscope-dev-images.yml
+++ b/.github/workflows/build-graphscope-dev-images.yml
@@ -48,7 +48,7 @@ jobs:
     if: (github.event_name == 'workflow_dispatch' && github.event.inputs.build_wheel == 'true') || (github.event_name == 'pull_request')
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -86,7 +86,7 @@ jobs:
     if: false
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -154,7 +154,7 @@ jobs:
     if: (github.event_name == 'workflow_dispatch' && github.event.inputs.build_graphscope_dev == 'true') || (github.event_name == 'pull_request')
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -192,7 +192,7 @@ jobs:
     if: false
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -260,7 +260,7 @@ jobs:
     if: (github.event_name == 'workflow_dispatch' && github.event.inputs.build_vineyard_dev == 'true') || (github.event_name == 'pull_request')
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -298,7 +298,7 @@ jobs:
     if: false
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -369,7 +369,7 @@ jobs:
 
     needs: [build-vineyard-dev-image-x86-64]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -410,7 +410,7 @@ jobs:
 
     needs: [manifest-push-vineyard-dev-image]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
diff --git a/.github/workflows/build-graphscope-images-linux.yml b/.github/workflows/build-graphscope-images-linux.yml
index 94485bf7d19c..dd90bd185c70 100644
--- a/.github/workflows/build-graphscope-images-linux.yml
+++ b/.github/workflows/build-graphscope-images-linux.yml
@@ -35,7 +35,7 @@ jobs:
     runs-on: ubuntu-20.04
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -172,7 +172,7 @@ jobs:
     # if: (github.ref == 'refs/heads/main' && github.repository == 'alibaba/GraphScope') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && github.repository == 'alibaba/GraphScope') || (github.pull_request == 'pull_request') || (github.event_name == 'workflow_dispatch')
     if: false
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         with:
           submodules: true
   
@@ -347,7 +347,7 @@ jobs:
     needs: [build-image-x86-64, build-image-aarch64]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
diff --git a/.github/workflows/build-graphscope-manylinux-ext-images.yml b/.github/workflows/build-graphscope-manylinux-ext-images.yml
index 355a3371054a..0c2844ab23ae 100644
--- a/.github/workflows/build-graphscope-manylinux-ext-images.yml
+++ b/.github/workflows/build-graphscope-manylinux-ext-images.yml
@@ -21,7 +21,7 @@ jobs:
   build-manylinux-ext-image-x86-64:
     runs-on: ubuntu-20.04
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -50,7 +50,7 @@ jobs:
     runs-on: [self-hosted, Linux, ARM64]
     if: false
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
diff --git a/.github/workflows/build-graphscope-wheels-linux.yml b/.github/workflows/build-graphscope-wheels-linux.yml
index 2f13331bc8de..b56be6542a0a 100644
--- a/.github/workflows/build-graphscope-wheels-linux.yml
+++ b/.github/workflows/build-graphscope-wheels-linux.yml
@@ -26,7 +26,7 @@ jobs:
     runs-on: [self-hosted, Linux, ARM64]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -66,7 +66,7 @@ jobs:
         # mv ${GITHUB_WORKSPACE}/coordinator/dist/*.whl ${GITHUB_WORKSPACE}/upload_pypi/
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: wheel-arm64-${{ github.sha }}
         path: |
@@ -98,7 +98,7 @@ jobs:
     runs-on: ubuntu-20.04
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -146,7 +146,7 @@ jobs:
         mv ${GITHUB_WORKSPACE}/coordinator/dist/*.whl ${GITHUB_WORKSPACE}/upload_pypi/
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: wheel-${{ github.sha }}
         path: |
@@ -179,11 +179,11 @@ jobs:
     needs: [build-wheels]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         path: artifacts
 
@@ -250,7 +250,7 @@ jobs:
         python-version: ['3.7', '3.8', '3.9', '3.10', '3.11']
 
     steps:
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         path: artifacts
 
@@ -306,7 +306,7 @@ jobs:
         --shm-size 4096m
 
     steps:
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         path: artifacts
 
diff --git a/.github/workflows/build-graphscope-wheels-macos.yml b/.github/workflows/build-graphscope-wheels-macos.yml
index c834207d56f7..bc7cb7362269 100644
--- a/.github/workflows/build-graphscope-wheels-macos.yml
+++ b/.github/workflows/build-graphscope-wheels-macos.yml
@@ -25,7 +25,7 @@ jobs:
         python-version: ['3.11']
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -135,7 +135,7 @@ jobs:
       uses: mxschmitt/action-tmate@v2
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: wheel-macos-${{ github.sha }}
         path: graphscope.tar.gz
@@ -149,7 +149,7 @@ jobs:
         python-version: ['3.8', '3.9', '3.10', '3.11']
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -221,7 +221,7 @@ jobs:
         tar -zcf client.tar.gz python/dist/
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: wheel-macos-${{ github.sha }}-${{ matrix.python-version }}
         path: client.tar.gz
@@ -237,7 +237,7 @@ jobs:
         python-version: ['3.8', '3.9', '3.10', '3.11']
 
     steps:
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         path: artifacts
 
@@ -285,7 +285,7 @@ jobs:
         python-version: ['3.8', '3.9', '3.10', '3.11']
 
     steps:
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         path: artifacts
 
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index c125bdc4a1ee..605fd4cb2605 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -24,7 +24,7 @@ jobs:
       contents: write
     steps:
     - name: Checkout Code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         repository: ${{ github.event.pull_request.head.repo.full_name }}
         ref: ${{ github.event.pull_request.head.ref }}
diff --git a/.github/workflows/flex-interactive.yml b/.github/workflows/flex-interactive.yml
index eb5dc514027e..18555bb44fb7 100644
--- a/.github/workflows/flex-interactive.yml
+++ b/.github/workflows/flex-interactive.yml
@@ -31,7 +31,7 @@ jobs:
 
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
 
     - name: Add envs to GITHUB_ENV
       run: |
diff --git a/.github/workflows/gae.yml b/.github/workflows/gae.yml
index 8145b477dc73..da8ad6ee82a6 100644
--- a/.github/workflows/gae.yml
+++ b/.github/workflows/gae.yml
@@ -32,7 +32,7 @@ jobs:
     container:
       image: registry.cn-hongkong.aliyuncs.com/graphscope/graphscope-dev:v0.22.0
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Install latest vineyard
       if: false
diff --git a/.github/workflows/gaia.yml b/.github/workflows/gaia.yml
index 5b288af9e91e..918c377241c9 100644
--- a/.github/workflows/gaia.yml
+++ b/.github/workflows/gaia.yml
@@ -24,7 +24,7 @@ jobs:
   gaia-test:
     runs-on: [self-hosted, manylinux2014]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -113,7 +113,7 @@ jobs:
 
     - name: Upload GIE log
       if: failure()
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       continue-on-error: true
       with:
         name: gie-log
diff --git a/.github/workflows/gss.yml b/.github/workflows/gss.yml
index 6421091dde1d..9652a1f792a5 100644
--- a/.github/workflows/gss.yml
+++ b/.github/workflows/gss.yml
@@ -44,7 +44,7 @@ jobs:
     runs-on: [self-hosted, manylinux2014]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Detect the tmate session
       run: |
@@ -87,7 +87,7 @@ jobs:
         mvn test -P gremlin-test
 
     - name: Upload tools for helm test to Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: groot
         path: |
@@ -103,7 +103,7 @@ jobs:
       JAVA_HOME: /usr/lib/jvm/default-java
       GS_TEST_DIR: ${{ github.workspace }}/gstest
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -114,7 +114,7 @@ jobs:
           exit 1
         fi
 
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       with:
         name: groot
         path: artifacts
@@ -231,7 +231,7 @@ jobs:
 
     - name: upload the k8s logs to artifact
       if: ${{ failure() }}
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       continue-on-error: true
       with:
         name: k8s-test-logs
diff --git a/.github/workflows/interactive.yml b/.github/workflows/interactive.yml
index 81491b240b75..3505505d0fb5 100644
--- a/.github/workflows/interactive.yml
+++ b/.github/workflows/interactive.yml
@@ -30,7 +30,7 @@ jobs:
     container:
       image: registry.cn-hongkong.aliyuncs.com/graphscope/graphscope-dev:v0.23.0
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: actions/cache@v3
       with:
@@ -372,7 +372,7 @@ jobs:
 
     steps:
     - name: Checkout code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
     
     - name: Install dependencies
       run: |
@@ -400,7 +400,7 @@ jobs:
         BUILD_TEST: [ON, OFF]
         BUILD_ODPS_FRAGMENT_LOADER: [ON, OFF]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Build
       run: |
@@ -416,7 +416,7 @@ jobs:
     container:
       image: registry.cn-hongkong.aliyuncs.com/graphscope/graphscope-dev:v0.23.0
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Download aocc compiler
       run: |
@@ -445,7 +445,7 @@ jobs:
     container:
       image: registry.cn-hongkong.aliyuncs.com/graphscope/graphscope-dev:v0.23.0
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Install latest libgrape-lite
       if: false
diff --git a/.github/workflows/k8s-ci-dummy.yml b/.github/workflows/k8s-ci-dummy.yml
index f24c6e19351e..78857883c413 100644
--- a/.github/workflows/k8s-ci-dummy.yml
+++ b/.github/workflows/k8s-ci-dummy.yml
@@ -37,7 +37,7 @@ jobs:
       gie-function-test: ${{ steps.filter.outputs.gie-function-test }}
     steps:
     # For push it's necessary to checkout the code
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     # For pull requests it's not necessary to checkout the code
     - uses: dorny/paths-filter@v2
       id: filter
diff --git a/.github/workflows/k8s-ci.yml b/.github/workflows/k8s-ci.yml
index a2f02b552c90..b9805782fb00 100644
--- a/.github/workflows/k8s-ci.yml
+++ b/.github/workflows/k8s-ci.yml
@@ -52,7 +52,7 @@ jobs:
       gie-function-test: ${{ steps.filter.outputs.gie-function-test }}
     steps:
     # For push it's necessary to checkout the code
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Detect the tmate session
       run: |
@@ -202,7 +202,7 @@ jobs:
     needs: [changes]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Build Artifact
       run: |
@@ -217,7 +217,7 @@ jobs:
         strip ${INSTALL_DIR}/builtin/*/*.so
 
     - name: Upload Artifacts
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: analytical
         path: ${{ github.workspace }}/install
@@ -229,7 +229,7 @@ jobs:
     #if: ${{ github.repository == 'alibaba/GraphScope' }}
     if: false
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: actions/cache@v3
       with:
@@ -252,7 +252,7 @@ jobs:
         strip ${INSTALL_DIR}/builtin/*/*.so
 
     - name: Upload Artifacts
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: analytical-java
         path: ${{ github.workspace }}/install
@@ -263,7 +263,7 @@ jobs:
     needs: [changes]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - uses: actions/cache@v3
       with:
@@ -294,7 +294,7 @@ jobs:
         sccache --show-stats
 
     - name: Upload Artifacts
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: interactive
         path: ${{ github.workspace }}/install
@@ -305,7 +305,7 @@ jobs:
     needs: [changes]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -335,7 +335,7 @@ jobs:
         cp dist/*.whl ${{ github.workspace }}/install/
 
     - name: Upload Artifacts
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: learning
         path: ${{ github.workspace }}/install
@@ -346,14 +346,14 @@ jobs:
   #   needs: [changes]
   #   if: false  # Wheels of learning includes coordinator and client
   #   steps:
-  #   - uses: actions/checkout@v3g
+  #   - uses: actions/checkout@v4g
 
   k8s-test:
     runs-on: [self-hosted, ubuntu2004]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     needs: [build-analytical, build-interactive, build-learning]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - uses: actions/cache@v3
         with:
@@ -362,7 +362,7 @@ jobs:
           restore-keys: |
             ${{ runner.os }}-pip-
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           path: artifacts
 
@@ -543,7 +543,7 @@ jobs:
           MODE: stop
 
       - name: Upload the k8s logs to artifact
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         if: ${{ always() }}
         continue-on-error: true
         with:
@@ -555,7 +555,7 @@ jobs:
     needs: [build-analytical, build-interactive, build-learning]
     if: ${{ needs.changes.outputs.gie-function-test == 'true' && github.repository == 'alibaba/GraphScope' }}
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - uses: actions/cache@v3
         with:
@@ -564,7 +564,7 @@ jobs:
           restore-keys: |
             ${{ runner.os }}-pip-
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           path: artifacts
 
@@ -619,7 +619,7 @@ jobs:
     runs-on: [self-hosted, manylinux2014]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
       - uses: actions/cache@v3
         with:
@@ -654,7 +654,7 @@ jobs:
             interactive_engine/executor/ir/target/release/${RPC_TARGET}
 
       - name: Upload Artifact
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: gie-experimental
           path: |
@@ -666,9 +666,9 @@ jobs:
     runs-on: [self-hosted, ubuntu2004]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: gie-experimental
           path: artifacts
@@ -735,7 +735,7 @@ jobs:
           MODE: stop
 
       - name: upload the k8s logs to artifact
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         continue-on-error: true
         if: ${{ always() }}
         with:
diff --git a/.github/workflows/local-ci-dummy.yml b/.github/workflows/local-ci-dummy.yml
index 9282d85fc6cc..0dc73235cc8c 100644
--- a/.github/workflows/local-ci-dummy.yml
+++ b/.github/workflows/local-ci-dummy.yml
@@ -37,7 +37,7 @@ jobs:
       gie-function-test: ${{ steps.filter.outputs.gie-function-test }}
     steps:
     # For push it's necessary to checkout the code
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
     # For pull requests it's not necessary to checkout the code
     - uses: dorny/paths-filter@v2
       id: filter
diff --git a/.github/workflows/local-ci.yml b/.github/workflows/local-ci.yml
index 48f3530e8844..25a6b2f30021 100644
--- a/.github/workflows/local-ci.yml
+++ b/.github/workflows/local-ci.yml
@@ -52,7 +52,7 @@ jobs:
       gie-function-test: ${{ steps.filter.outputs.gie-function-test }}
     steps:
     # For push it's necessary to checkout the code
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Detect the tmate session
       run: |
@@ -207,7 +207,7 @@ jobs:
     needs: [changes]
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -257,7 +257,7 @@ jobs:
         tar -zcf graphscope.tar.gz coordinator/dist/
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: wheel-${{ github.sha }}
         path: |
@@ -270,9 +270,9 @@ jobs:
     if: ${{ github.repository == 'alibaba/GraphScope' }}
     needs: [build-wheels]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           path: artifacts
 
@@ -320,7 +320,7 @@ jobs:
 
       - name: Upload GIE log
         if: failure()
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         continue-on-error: true
         with:
           name: gie-log
@@ -338,10 +338,10 @@ jobs:
         deployment: ["standalone", "distributed"]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       if: ${{ needs.changes.outputs.gae-python == 'true' }}
 
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       if: ${{ needs.changes.outputs.gae-python == 'true' }}
       with:
         path: artifacts
@@ -407,7 +407,7 @@ jobs:
       matrix:
         deployment: ["standalone", "distributed"]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       if: ${{ needs.changes.outputs.networkx == 'true' }}
 
     - uses: dorny/paths-filter@v2
@@ -429,7 +429,7 @@ jobs:
             - 'python/graphscope/nx/convert_matrix.py'
             - 'python/graphscope/nx/tests/convert/**'
 
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       if: ${{ needs.changes.outputs.networkx == 'true' }}
       with:
         path: artifacts
@@ -496,7 +496,7 @@ jobs:
       matrix:
         deployment: ["standalone", "distributed"]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       if: ${{ needs.changes.outputs.networkx == 'true' }}
 
     - uses: dorny/paths-filter@v2
@@ -516,7 +516,7 @@ jobs:
           io:
             - 'python/graphscope/nx/readwrite/**'
 
-    - uses: actions/download-artifact@v3
+    - uses: actions/download-artifact@v4
       if: ${{ needs.changes.outputs.networkx == 'true' }}
       with:
         path: artifacts
diff --git a/.github/workflows/networkx-forward-algo-nightly.yml b/.github/workflows/networkx-forward-algo-nightly.yml
index d745472b43cf..f395b0a4a7a3 100644
--- a/.github/workflows/networkx-forward-algo-nightly.yml
+++ b/.github/workflows/networkx-forward-algo-nightly.yml
@@ -22,7 +22,7 @@ jobs:
         --shm-size 4096m
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Build GAE and coordinator
       run: |
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index ecd8d8333559..1d2fa34f47c6 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -20,7 +20,7 @@ jobs:
       matrix:
         os: [ubuntu-22.04, macos-latest]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
diff --git a/.github/workflows/pegasus.yml b/.github/workflows/pegasus.yml
index ff4f204c2c9c..4d96fb74b3c8 100644
--- a/.github/workflows/pegasus.yml
+++ b/.github/workflows/pegasus.yml
@@ -23,7 +23,7 @@ jobs:
   pegasus-build:
     runs-on: ubuntu-20.04
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Build & Test
       run: |
@@ -51,7 +51,7 @@ jobs:
 #  k8s-test:
 #    runs-on: [self-hosted, ubuntu2004]
 #    steps:
-#    - uses: actions/checkout@v3
+#    - uses: actions/checkout@v4
 #
 #    - name: Detect the tmate session
 #      run: |
diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml
index 8913ced96921..fa6baad55298 100644
--- a/.github/workflows/pr-check.yml
+++ b/.github/workflows/pr-check.yml
@@ -15,7 +15,7 @@ jobs:
     runs-on: ubuntu-20.04
     steps:
     - name: Checkout Code
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         repository: ${{ github.event.pull_request.head.repo.full_name }}
         ref: ${{ github.event.pull_request.head.ref }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 69851500143b..77adb6251a79 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -27,7 +27,7 @@ jobs:
     runs-on: ubuntu-20.04
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Build Wheel Package
       run: |
@@ -49,7 +49,7 @@ jobs:
         tar -zcf gsctl.tar.gz ${GITHUB_WORKSPACE}/upload_pypi/*.whl
 
     - name: Upload Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: gsctl-${{ github.sha }}
         path: |
@@ -69,7 +69,7 @@ jobs:
     runs-on: ubuntu-20.04
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Add envs to GITHUB_ENV
       run: |
@@ -102,7 +102,7 @@ jobs:
     if: (github.ref == 'refs/heads/main' && github.repository == 'alibaba/GraphScope') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && github.repository == 'alibaba/GraphScope')
     runs-on: ubuntu-20.04
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Add envs to GITHUB_ENV
       run: |
@@ -155,7 +155,7 @@ jobs:
     if: false
     runs-on: [self-hosted, Linux, ARM64]
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Add envs to GITHUB_ENV
       run: |
@@ -232,7 +232,7 @@ jobs:
     needs: [build-gss-image-x86-64, build-gss-image-aarch64]
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         submodules: true
 
@@ -261,7 +261,7 @@ jobs:
     if: ${{ github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') && github.repository == 'alibaba/GraphScope' }}
     runs-on: ubuntu-20.04
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     # this step is needed for update index.yaml
     - name: Download Released Charts
diff --git a/analytical_engine/CMakeLists.txt b/analytical_engine/CMakeLists.txt
index fa5853dce7d4..bac1a4b1492d 100644
--- a/analytical_engine/CMakeLists.txt
+++ b/analytical_engine/CMakeLists.txt
@@ -289,7 +289,7 @@ endif()
 execute_process(COMMAND python3 ../proto/proto_generator.py "${PROJECT_SOURCE_DIR}/proto" --cpp
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
 
-file(GLOB PROTO_CPP_FILES "proto/*.cc")
+file(GLOB PROTO_CPP_FILES "proto/*.cc" "proto/error/*.cc")
 file(GLOB CORE_RPC_SRC_FILES "core/server/*.cc")
 
 # Add targets
diff --git a/analytical_engine/apps/sssp/sssp_average_length.h b/analytical_engine/apps/sssp/sssp_average_length.h
index e064bc5f576b..b1de0b5dba43 100644
--- a/analytical_engine/apps/sssp/sssp_average_length.h
+++ b/analytical_engine/apps/sssp/sssp_average_length.h
@@ -109,7 +109,6 @@ class SSSPAverageLength
     bool update_sum = false;
 
     pair_msg_t msg;
-    int msg_cnt = 0;
     while (messages.GetMessage<pair_msg_t>(msg)) {
       bool is_vertex_msg = msg.first;
       if (is_vertex_msg) {
@@ -129,7 +128,6 @@ class SSSPAverageLength
         fid_t fid = (fid_t)(std::get<0>(msg.second));
         ctx.all_sums[fid] = std::get<2>(msg.second);
       }
-      msg_cnt++;
     }
 
     for (auto& it : updated_map) {
diff --git a/analytical_engine/core/error.h b/analytical_engine/core/error.h
index a5a1e0c6f60f..6d7f3f086bf4 100644
--- a/analytical_engine/core/error.h
+++ b/analytical_engine/core/error.h
@@ -24,7 +24,7 @@
 
 #include "vineyard/graph/utils/error.h"  // IWYU pragma: export
 
-#include "proto/error_codes.pb.h"  // IWYU pragma: export
+#include "proto/error/coordinator.pb.h"  // IWYU pragma: export
 
 namespace gs {
 
@@ -35,21 +35,28 @@ inline rpc::Code ErrorCodeToProto(vineyard::ErrorCode ec) {
   case vineyard::ErrorCode::kVineyardError:
     return rpc::Code::VINEYARD_ERROR;
   case vineyard::ErrorCode::kNetworkError:
-    return rpc::Code::NETWORK_ERROR;
+    return rpc::Code::NETWORK_FAILURE;
   case vineyard::ErrorCode::kUnimplementedMethod:
-    return rpc::Code::UNIMPLEMENTED_ERROR;
+    return rpc::Code::UNIMPLEMENTED;
   default:
     return rpc::Code::ANALYTICAL_ENGINE_INTERNAL_ERROR;
   }
 }
 
+inline std::string formatEnumValue(const vineyard::ErrorCode& value) {
+  std::stringstream ss;
+  // Format the integer value with leading zeros (4 digits)
+  ss << "02-" << std::setw(4) << std::setfill('0') << static_cast<int>(value);
+  return ss.str();
+}
+
 #ifndef __FRAME_MAKE_GS_ERROR
 #define __FRAME_MAKE_GS_ERROR(var, code, msg)                               \
   do {                                                                      \
     std::stringstream TOKENPASTE2(_ss, __LINE__);                           \
     vineyard::backtrace_info::backtrace(TOKENPASTE2(_ss, __LINE__), true);  \
     LOG(ERROR) << "graphscope error in frame: code = "                      \
-               << static_cast<int>(code) << " at "                          \
+               << gs::formatEnumValue(code) << " at "                       \
                << (std::string(__FILE__) + ":" + std::to_string(__LINE__) + \
                    ": " + std::string(__FUNCTION__))                        \
                << " -> " << (msg)                                           \
@@ -68,7 +75,7 @@ inline rpc::Code ErrorCodeToProto(vineyard::ErrorCode ec) {
     std::stringstream TOKENPASTE2(_ss, __LINE__);                           \
     vineyard::backtrace_info::backtrace(TOKENPASTE2(_ss, __LINE__), true);  \
     LOG(ERROR) << "graphscope error in frame: code = "                      \
-               << static_cast<int>(code) << " at "                          \
+               << gs::formatEnumValue(code) << " at "                       \
                << (std::string(__FILE__) + ":" + std::to_string(__LINE__) + \
                    ": " + std::string(__FUNCTION__))                        \
                << " -> " << (msg)                                           \
diff --git a/analytical_engine/core/server/dispatcher.h b/analytical_engine/core/server/dispatcher.h
index ecbffda33805..885333238d7a 100644
--- a/analytical_engine/core/server/dispatcher.h
+++ b/analytical_engine/core/server/dispatcher.h
@@ -25,7 +25,7 @@
 #include "grape/worker/comm_spec.h"
 #include "vineyard/common/util/blocking_queue.h"
 
-#include "proto/error_codes.pb.h"
+#include "proto/error/coordinator.pb.h"
 #include "proto/graph_def.pb.h"
 #include "proto/types.pb.h"
 
diff --git a/analytical_engine/core/server/graphscope_service.cc b/analytical_engine/core/server/graphscope_service.cc
index a29f32ddad89..3fe47bf60263 100644
--- a/analytical_engine/core/server/graphscope_service.cc
+++ b/analytical_engine/core/server/graphscope_service.cc
@@ -27,7 +27,7 @@
 
 #include "core/server/rpc_utils.h"
 #include "proto/attr_value.pb.h"
-#include "proto/error_codes.pb.h"
+#include "proto/error/coordinator.pb.h"
 #include "proto/graph_def.pb.h"
 #include "proto/message.pb.h"
 #include "proto/op_def.pb.h"
diff --git a/analytical_engine/core/worker/default_property_worker.h b/analytical_engine/core/worker/default_property_worker.h
index 28f89b9ffcc1..5fd89a601507 100644
--- a/analytical_engine/core/worker/default_property_worker.h
+++ b/analytical_engine/core/worker/default_property_worker.h
@@ -95,8 +95,6 @@ class DefaultPropertyWorker {
 
     context_->Init(messages_, std::forward<Args>(args)...);
 
-    int round = 0;
-
     messages_.Start();
 
     messages_.StartARound();
@@ -114,7 +112,6 @@ class DefaultPropertyWorker {
 
     while (!messages_.ToTerminate()) {
       t = grape::GetCurrentTime();
-      round++;
       messages_.StartARound();
 
       app_->IncEval(graph, *context_, messages_);
diff --git a/analytical_engine/core/worker/default_worker.h b/analytical_engine/core/worker/default_worker.h
index 9c4587951074..7e304e56f5aa 100644
--- a/analytical_engine/core/worker/default_worker.h
+++ b/analytical_engine/core/worker/default_worker.h
@@ -95,8 +95,6 @@ class DefaultWorker {
 
     context_->Init(messages_, std::forward<Args>(args)...);
 
-    int round = 0;
-
     messages_.Start();
 
     messages_.StartARound();
@@ -114,7 +112,6 @@ class DefaultWorker {
 
     while (!messages_.ToTerminate()) {
       t = grape::GetCurrentTime();
-      round++;
       messages_.StartARound();
 
       app_->IncEval(graph, *context_, messages_);
diff --git a/analytical_engine/core/worker/parallel_property_worker.h b/analytical_engine/core/worker/parallel_property_worker.h
index 3455732a24ea..54f3b81ca822 100644
--- a/analytical_engine/core/worker/parallel_property_worker.h
+++ b/analytical_engine/core/worker/parallel_property_worker.h
@@ -95,8 +95,6 @@ class ParallelPropertyWorker {
 
     context_->Init(messages_, std::forward<Args>(args)...);
 
-    int round = 0;
-
     messages_.Start();
 
     messages_.StartARound();
@@ -114,7 +112,6 @@ class ParallelPropertyWorker {
 
     while (!messages_.ToTerminate()) {
       t = grape::GetCurrentTime();
-      round++;
       messages_.StartARound();
 
       app_->IncEval(*graph_, *context_, messages_);
diff --git a/analytical_engine/core/worker/property_auto_worker.h b/analytical_engine/core/worker/property_auto_worker.h
index 11e71c948da0..07b5ce0b19d4 100644
--- a/analytical_engine/core/worker/property_auto_worker.h
+++ b/analytical_engine/core/worker/property_auto_worker.h
@@ -90,8 +90,6 @@ class PropertyAutoWorker {
 
     context_->Init(messages_, std::forward<Args>(args)...);
 
-    int round = 0;
-
     messages_.Start();
 
     messages_.StartARound();
@@ -109,7 +107,6 @@ class PropertyAutoWorker {
 
     while (!messages_.ToTerminate()) {
       t = grape::GetCurrentTime();
-      round++;
       messages_.StartARound();
 
       app_->IncEval(graph, *context_);
diff --git a/charts/graphscope-store/templates/coordinator/statefulset.yaml b/charts/graphscope-store/templates/coordinator/statefulset.yaml
index e8b0f999e475..8a088ba67a97 100644
--- a/charts/graphscope-store/templates/coordinator/statefulset.yaml
+++ b/charts/graphscope-store/templates/coordinator/statefulset.yaml
@@ -89,6 +89,14 @@ spec:
           env:
             - name: ROLE
               value: "coordinator"
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
           ports:
             - name: inner-rpc
               containerPort: 55555
diff --git a/charts/graphscope-store/templates/frontend/statefulset.yaml b/charts/graphscope-store/templates/frontend/statefulset.yaml
index 6bd079d117ff..4689313603c8 100644
--- a/charts/graphscope-store/templates/frontend/statefulset.yaml
+++ b/charts/graphscope-store/templates/frontend/statefulset.yaml
@@ -89,6 +89,14 @@ spec:
           env:
             - name: ROLE
               value: "frontend"
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
           ports:
             - name: grpc
               containerPort: {{ .Values.frontend.service.servicePort }}
diff --git a/charts/graphscope-store/templates/onepod/statefulset.yaml b/charts/graphscope-store/templates/onepod/statefulset.yaml
index 0143756f872b..d05c928a0a46 100644
--- a/charts/graphscope-store/templates/onepod/statefulset.yaml
+++ b/charts/graphscope-store/templates/onepod/statefulset.yaml
@@ -89,6 +89,14 @@ spec:
           env:
             - name: ROLE
               value: ""
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
           ports:
             - name: gremlin
               containerPort: {{ .Values.frontend.service.gremlinPort }}
diff --git a/charts/graphscope-store/templates/store/statefulset-backup.yaml b/charts/graphscope-store/templates/store/statefulset-backup.yaml
index 0f6bf76f3112..aedefc5b5bb1 100644
--- a/charts/graphscope-store/templates/store/statefulset-backup.yaml
+++ b/charts/graphscope-store/templates/store/statefulset-backup.yaml
@@ -93,6 +93,14 @@ spec:
           env:
             - name: ROLE
               value: "store"
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
           ports:
             - name: inner-rpc
               containerPort: 55555
diff --git a/charts/graphscope-store/templates/store/statefulset.yaml b/charts/graphscope-store/templates/store/statefulset.yaml
index f75a0c5a8141..9bb943aa27c9 100644
--- a/charts/graphscope-store/templates/store/statefulset.yaml
+++ b/charts/graphscope-store/templates/store/statefulset.yaml
@@ -89,6 +89,14 @@ spec:
           env:
             - name: ROLE
               value: "store"
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
           ports:
             - name: inner-rpc
               containerPort: 55555
diff --git a/coordinator/gscoordinator/kubernetes_launcher.py b/coordinator/gscoordinator/kubernetes_launcher.py
index aca70b6475a9..978b1168068f 100644
--- a/coordinator/gscoordinator/kubernetes_launcher.py
+++ b/coordinator/gscoordinator/kubernetes_launcher.py
@@ -1519,9 +1519,11 @@ def create_learning_instance(self, object_id, handle, config, learning_backend):
                 pod_name_list, pod_host_ip_list, object_id, handle, config
             )
         elif learning_backend == message_pb2.LearningBackend.GRAPHLEARN_TORCH:
-            pod_name_list, pod_ip_list, pod_host_ip_list = (
-                self._allocate_graphlearn_torch_engine(object_id)
-            )
+            (
+                pod_name_list,
+                pod_ip_list,
+                pod_host_ip_list,
+            ) = self._allocate_graphlearn_torch_engine(object_id)
             if not pod_name_list or not pod_host_ip_list:
                 raise RuntimeError("Failed to allocate learning engine")
             return self._distribute_graphlearn_torch_process(
diff --git a/coordinator/gscoordinator/op_executor.py b/coordinator/gscoordinator/op_executor.py
index 8e9f33f27492..a1d179c337ac 100644
--- a/coordinator/gscoordinator/op_executor.py
+++ b/coordinator/gscoordinator/op_executor.py
@@ -29,7 +29,7 @@
 from graphscope.proto import message_pb2
 from graphscope.proto import op_def_pb2
 from graphscope.proto import types_pb2
-from graphscope.proto.error_codes_pb2 import OK
+from graphscope.proto.error.coordinator_pb2 import OK
 
 from gscoordinator.launcher import AbstractLauncher
 from gscoordinator.monitor import Monitor
diff --git a/coordinator/gscoordinator/servicer/graphscope_one/service.py b/coordinator/gscoordinator/servicer/graphscope_one/service.py
index 904f27d13c54..6adca8df7f91 100644
--- a/coordinator/gscoordinator/servicer/graphscope_one/service.py
+++ b/coordinator/gscoordinator/servicer/graphscope_one/service.py
@@ -47,9 +47,9 @@
 from graphscope.framework.utils import i_to_attr
 from graphscope.framework.utils import s_to_attr
 from graphscope.proto import coordinator_service_pb2_grpc
-from graphscope.proto import error_codes_pb2
 from graphscope.proto import message_pb2
 from graphscope.proto import types_pb2
+from graphscope.proto.error import coordinator_pb2
 
 from gscoordinator.dag_manager import DAGManager
 from gscoordinator.dag_manager import GSEngine
@@ -235,29 +235,29 @@ def _RunStep(self, request_iterator, context):
 
         while not dag_manager.empty():
             run_dag_on, dag, dag_bodies = dag_manager.next_dag()
-            error_code = error_codes_pb2.COORDINATOR_INTERNAL_ERROR
+            error_code = coordinator_pb2.COORDINATOR_INTERNAL_ERROR
             head, bodies = None, None
             try:
                 # run on analytical engine
                 if run_dag_on == GSEngine.analytical_engine:
                     # need dag_bodies to load graph from pandas/numpy
-                    error_code = error_codes_pb2.ANALYTICAL_ENGINE_INTERNAL_ERROR
+                    error_code = coordinator_pb2.ANALYTICAL_ENGINE_INTERNAL_ERROR
                     head, bodies = self._operation_executor.run_on_analytical_engine(
                         dag, dag_bodies, loader_op_bodies
                     )
                 # run on interactive engine
                 elif run_dag_on == GSEngine.interactive_engine:
-                    error_code = error_codes_pb2.INTERACTIVE_ENGINE_INTERNAL_ERROR
+                    error_code = coordinator_pb2.INTERACTIVE_ENGINE_INTERNAL_ERROR
                     head, bodies = self._operation_executor.run_on_interactive_engine(
                         dag
                     )
                 # run on learning engine
                 elif run_dag_on == GSEngine.learning_engine:
-                    error_code = error_codes_pb2.LEARNING_ENGINE_INTERNAL_ERROR
+                    error_code = coordinator_pb2.LEARNING_ENGINE_INTERNAL_ERROR
                     head, bodies = self._operation_executor.run_on_learning_engine(dag)
                 # run on coordinator
                 elif run_dag_on == GSEngine.coordinator:
-                    error_code = error_codes_pb2.COORDINATOR_INTERNAL_ERROR
+                    error_code = coordinator_pb2.COORDINATOR_INTERNAL_ERROR
                     head, bodies = self._operation_executor.run_on_coordinator(
                         dag, dag_bodies, loader_op_bodies
                     )
diff --git a/docs/error_codes.md b/docs/error_codes.md
new file mode 100644
index 000000000000..4c52a6a8851c
--- /dev/null
+++ b/docs/error_codes.md
@@ -0,0 +1,3 @@
+# Error Codes
+
+The list of error codes is defined in protobuf. See [here](https://github.com/alibaba/GraphScope/tree/main/proto/error) for latest code collections.
\ No newline at end of file
diff --git a/interactive_engine/assembly/src/bin/groot/store_ctl.sh b/interactive_engine/assembly/src/bin/groot/store_ctl.sh
index 655b00875dd5..2342adff0693 100755
--- a/interactive_engine/assembly/src/bin/groot/store_ctl.sh
+++ b/interactive_engine/assembly/src/bin/groot/store_ctl.sh
@@ -27,21 +27,13 @@ _setup_env() {
 		GROOT_HOME=$(dirname "$SCRIPT_DIR")
 	fi
 
-	if [ -z "${GROOT_LOGBACK_FILE}" ]; then
-		readonly GROOT_LOGBACK_FILE="${GROOT_HOME}/conf/logback.xml"
-	fi
-
-	if [ -z "${GROOT_CONF_FILE}" ]; then
-		readonly GROOT_CONF_FILE="${GROOT_HOME}/conf/groot.config"
-	fi
-
-	if [ -z "${LOG_NAME}" ]; then
-		readonly LOG_NAME="graphscope-store"
-	fi
-
-	if [ -z "${LOG_DIR}" ]; then
-		export LOG_DIR="/var/log/graphscope"
-	fi
+	export GROOT_LOGBACK_FILE=${GROOT_LOGBACK_FILE:-${GROOT_HOME}/conf/logback.xml}
+	export GROOT_CONF_FILE=${GROOT_CONF_FILE:-${GROOT_HOME}/conf/groot.config}
+	export LOG_NAME=${LOG_NAME:-graphscope-store}
+	export LOG_DIR=${LOG_DIR:-/var/log/graphscope}
+	export LOG_MAX_FILE_SIZE=${LOG_MAX_FILE_SIZE:-100MB}
+	export LOG_MAX_HISTORY=${LOG_MAX_HISTORY:-10}
+	export LOG_TOTAL_SIZE_CAP=${LOG_TOTAL_SIZE_CAP:-1GB}
 
 	mkdir -p ${LOG_DIR}
 
diff --git a/interactive_engine/assembly/src/conf/graphscope/log4j2.xml b/interactive_engine/assembly/src/conf/graphscope/log4j2.xml
index 0a9dad7a26f1..17b810929a2d 100644
--- a/interactive_engine/assembly/src/conf/graphscope/log4j2.xml
+++ b/interactive_engine/assembly/src/conf/graphscope/log4j2.xml
@@ -3,11 +3,11 @@
 
     <Appenders>
         <Console name="STDOUT" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS}|%-5level|%c - %msg%n"/>
+            <PatternLayout pattern="%d{HH:mm:ss.SSS}|%-5level|%c - %m%n"/>
         </Console>
 
         <RollingFile name="RollingFile" fileName="${sys:logfilename}" filePattern="${sys:logfilename}.%i">
-            <PatternLayout pattern="%d{DEFAULT} %p [%X{traceId}] [%t] [%c{1}] - %m%n"/>
+            <PatternLayout pattern="%d{DEFAULT} %p [%t] [%c{1}] [%X]  - %m%n"/>
             <Policies>
                 <SizeBasedTriggeringPolicy size="200 MB"/>
             </Policies>
@@ -24,10 +24,8 @@
 
     <Loggers>
         <!-- package loggers -->
-        <Logger name="org.testcontainers" level="INFO" additivity="true"/>
         <Logger name="io.grpc" level="INFO" additivity="true"/>
         <Logger name="io.netty" level="INFO" additivity="true"/>
-        <Logger name="com.github.dockerjava" level="INFO" additivity="true"/>
         <Logger name="MetricLog" level="INFO" additivity="false">
             <AppenderRef ref="Metric"/>
         </Logger>
diff --git a/interactive_engine/assembly/src/conf/graphscope/log4rs.yml b/interactive_engine/assembly/src/conf/graphscope/log4rs.yml
index 320c8a37a90b..93319ac1a95a 100644
--- a/interactive_engine/assembly/src/conf/graphscope/log4rs.yml
+++ b/interactive_engine/assembly/src/conf/graphscope/log4rs.yml
@@ -4,7 +4,7 @@ appenders:
   stdout:
     kind: console
     encoder:
-      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}] {m}{n}"
+      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}][{X(trace)}] {m}{n}"
 
 root:
   level: info
diff --git a/interactive_engine/assembly/src/conf/groot/log4rs.yml b/interactive_engine/assembly/src/conf/groot/log4rs.yml
index b14c5bc40d7c..0278475a7499 100644
--- a/interactive_engine/assembly/src/conf/groot/log4rs.yml
+++ b/interactive_engine/assembly/src/conf/groot/log4rs.yml
@@ -1,22 +1,22 @@
-refresh_rate: 30 seconds
+refresh_rate: 60 seconds
 appenders:
   stdout:
     kind: console
     encoder:
-      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}] {m}{n}"
+      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}] {m}{n} {X(trace)}"
   file:
     kind: rolling_file
     append: true
     path: "$ENV{LOG_DIR}/store-executor.log"
     encoder:
-      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}] {m}{n}"
+      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {h({l:<5})} (({f}:{L})) [{T}] {m}{n} {X(trace)}"
     policy:
       trigger:
         kind: size
         limit: 100mb
       roller:
         kind: fixed_window
-        pattern: "$ENV{LOG_DIR}/store-executor.log.{}"
+        pattern: "$ENV{LOG_DIR}/store-executor.{}.log"
         count: 10
 
 root:
diff --git a/interactive_engine/assembly/src/conf/groot/logback.xml b/interactive_engine/assembly/src/conf/groot/logback.xml
index 251f6a8990b9..05953484c7ef 100644
--- a/interactive_engine/assembly/src/conf/groot/logback.xml
+++ b/interactive_engine/assembly/src/conf/groot/logback.xml
@@ -1,29 +1,31 @@
-<configuration scan="true" scanPeriod="30 seconds">
-    <property name="log_dir" value="${log.dir:-/var/log/graphscope}"/>
-    <property name="log_name" value="${log.name:-groot}"/>
+<configuration scan="true" scanPeriod="60 seconds">
+    <property name="log_dir" value="${LOG_DIR:-/var/log/graphscope}"/>
+    <property name="log_name" value="${LOG_NAME:-graphscope-store}"/>
+    <property name="log_max_file_size" value="${LOG_MAX_FILE_SIZE:-100MB}"/>
+    <property name="log_max_history" value="${LOG_MAX_HISTORY:-10}"/>
+    <property name="log_total_size_cap" value="${LOG_TOTAL_SIZE_CAP:-1GB}"/>
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${log_dir}/${log_name}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${log_dir}/${log_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <maxFileSize>100MB</maxFileSize>
-            <maxHistory>10</maxHistory>
-            <totalSizeCap>1GB</totalSizeCap>
+            <fileNamePattern>${log_dir}/${log_name}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
+            <maxFileSize>${log_max_file_size}</maxFileSize>
+            <maxHistory>${log_max_history}</maxHistory>
+            <totalSizeCap>${log_total_size_cap}</totalSizeCap>
         </rollingPolicy>
         <encoder>
-            <pattern>[%d{ISO8601}][%p][%t][%c:%L] %m%n</pattern>
+            <pattern>[%d{ISO8601}][%p][%t][%c{3}] %m%n %X</pattern>
         </encoder>
     </appender>
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
-            <pattern>[%d{ISO8601}][%p][%t][%c:%L] %m%n</pattern>
+            <pattern>[%d{ISO8601}][%p][%t][%c{3}] %m%n %X</pattern>
         </encoder>
     </appender>
     <appender name="Metric" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${log_dir}/metric.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <fileNamePattern>${log_dir}/metric.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
-            <maxFileSize>100MB</maxFileSize>
-            <maxHistory>5</maxHistory>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log_dir}/metric.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
+            <maxHistory>7</maxHistory>
             <totalSizeCap>500MB</totalSizeCap>
         </rollingPolicy>
         <encoder>
diff --git a/interactive_engine/common/pom.xml b/interactive_engine/common/pom.xml
index 38c3464d449a..2590c6fe6d70 100644
--- a/interactive_engine/common/pom.xml
+++ b/interactive_engine/common/pom.xml
@@ -121,6 +121,7 @@
                 <include>ddl_service.proto</include>
                 <include>write_service.proto</include>
                 <include>request_option.proto</include>
+                <include>error/insight.proto</include>
               </includes>
             </configuration>
             <goals>
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/RoleType.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/RoleType.java
index 1125ab52e9a5..d1a919a0639d 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/RoleType.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/RoleType.java
@@ -13,6 +13,8 @@
  */
 package com.alibaba.graphscope.groot.common;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+
 import java.util.HashMap;
 import java.util.Map;
 
@@ -46,7 +48,7 @@ public String getName() {
     public static RoleType fromName(String roleName) {
         RoleType roleType = lookup.get(roleName);
         if (roleType == null || roleType == RoleType.UNKNOWN) {
-            throw new IllegalArgumentException("Unknown RoleType: [" + roleName + "]");
+            throw new InvalidArgumentException("Unknown RoleType: [" + roleName + "]");
         }
         return roleType;
     }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/config/Config.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/config/Config.java
index f18c444de55d..f636e377b68e 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/config/Config.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/config/Config.java
@@ -15,6 +15,8 @@
  */
 package com.alibaba.graphscope.groot.common.config;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+
 import java.util.function.Function;
 
 public class Config<T> {
@@ -35,7 +37,7 @@ public T get(Configs configs) {
             T val = parseFunc.apply(valStr);
             return val;
         } catch (Exception e) {
-            throw new IllegalArgumentException(
+            throw new InvalidArgumentException(
                     "key [" + key + "] val [" + valStr + "] parse failed", e);
         }
     }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/AlreadyExistsException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/AlreadyExistsException.java
new file mode 100644
index 000000000000..1f0ed751da90
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/AlreadyExistsException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class AlreadyExistsException extends GrootException {
+    public AlreadyExistsException(Throwable t) {
+        super(Code.ALREADY_EXISTS, t);
+    }
+
+    public AlreadyExistsException(String msg) {
+        super(Code.ALREADY_EXISTS, msg);
+    }
+
+    public AlreadyExistsException(String msg, Throwable t) {
+        super(Code.ALREADY_EXISTS, msg, t);
+    }
+
+    public AlreadyExistsException() {
+        super(Code.ALREADY_EXISTS);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/BackupException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/BackupException.java
index 58b0ed6c514a..b3ee2ef18de8 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/BackupException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/BackupException.java
@@ -15,8 +15,22 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
+import com.alibaba.graphscope.proto.Code;
+
 public class BackupException extends GrootException {
     public BackupException(String msg) {
-        super(msg);
+        super(Code.BACKUP_FAILED, msg);
+    }
+
+    public BackupException(String msg, Throwable t) {
+        super(Code.BACKUP_FAILED, msg, t);
+    }
+
+    public BackupException() {
+        super(Code.BACKUP_FAILED);
+    }
+
+    public BackupException(Throwable t) {
+        super(Code.BACKUP_FAILED, t);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CancelledException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CancelledException.java
new file mode 100644
index 000000000000..0209db3abc6e
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CancelledException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class CancelledException extends GrootException {
+    public CancelledException(String msg) {
+        super(Code.CANCELLED, msg);
+    }
+
+    public CancelledException(String msg, Throwable t) {
+        super(Code.CANCELLED, msg, t);
+    }
+
+    public CancelledException() {
+        super(Code.CANCELLED);
+    }
+
+    public CancelledException(Throwable t) {
+        super(Code.CANCELLED, t);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CompilationFailureException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CompilationFailureException.java
new file mode 100644
index 000000000000..0d267ba2df3a
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/CompilationFailureException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class CompilationFailureException extends GrootException {
+    public CompilationFailureException(Throwable t) {
+        super(Code.COMPILATION_FAILURE, t);
+    }
+
+    public CompilationFailureException(String msg) {
+        super(Code.COMPILATION_FAILURE, msg);
+    }
+
+    public CompilationFailureException(String msg, Throwable t) {
+        super(Code.COMPILATION_FAILURE, msg, t);
+    }
+
+    public CompilationFailureException() {
+        super(Code.COMPILATION_FAILURE);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DataNotExistsException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DataNotExistsException.java
new file mode 100644
index 000000000000..48fccea7ddb3
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DataNotExistsException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class DataNotExistsException extends GrootException {
+    public DataNotExistsException(Throwable t) {
+        super(Code.DATA_NOT_EXISTS, t);
+    }
+
+    public DataNotExistsException(String msg) {
+        super(Code.DATA_NOT_EXISTS, msg);
+    }
+
+    public DataNotExistsException(String msg, Throwable t) {
+        super(Code.DATA_NOT_EXISTS, msg, t);
+    }
+
+    public DataNotExistsException() {
+        super(Code.DATA_NOT_EXISTS);
+    }
+}
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/request/DdlException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DdlException.java
similarity index 69%
rename from interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/request/DdlException.java
rename to interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DdlException.java
index 2344d954f501..b3d234dad869 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/request/DdlException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/DdlException.java
@@ -13,17 +13,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.alibaba.graphscope.groot.schema.request;
+package com.alibaba.graphscope.groot.common.exception;
 
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.proto.Code;
 
 public class DdlException extends GrootException {
 
+    public DdlException(Throwable t) {
+        super(Code.DDL_ERROR, t);
+    }
+
     public DdlException(String msg) {
-        super(msg);
+        super(Code.DDL_ERROR, msg);
     }
 
-    public DdlException(Throwable t) {
-        super(t);
+    public DdlException(String msg, Throwable t) {
+        super(Code.DDL_ERROR, msg, t);
+    }
+
+    public DdlException() {
+        super(Code.DDL_ERROR);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ExternalStorageErrorException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ExternalStorageErrorException.java
new file mode 100644
index 000000000000..d4d3d141b314
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ExternalStorageErrorException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class ExternalStorageErrorException extends GrootException {
+    public ExternalStorageErrorException(Throwable t) {
+        super(Code.EXTERNAL_STORAGE_ERROR, t);
+    }
+
+    public ExternalStorageErrorException(String msg) {
+        super(Code.EXTERNAL_STORAGE_ERROR, msg);
+    }
+
+    public ExternalStorageErrorException(String msg, Throwable t) {
+        super(Code.EXTERNAL_STORAGE_ERROR, msg, t);
+    }
+
+    public ExternalStorageErrorException() {
+        super(Code.EXTERNAL_STORAGE_ERROR);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GaiaInternalException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GaiaInternalException.java
new file mode 100644
index 000000000000..cf16897840c8
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GaiaInternalException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class GaiaInternalException extends GrootException {
+    public GaiaInternalException(Throwable t) {
+        super(Code.GAIA_INTERNAL_ERROR, t);
+    }
+
+    public GaiaInternalException(String msg) {
+        super(Code.GAIA_INTERNAL_ERROR, msg);
+    }
+
+    public GaiaInternalException(String msg, Throwable t) {
+        super(Code.GAIA_INTERNAL_ERROR, msg, t);
+    }
+
+    public GaiaInternalException() {
+        super(Code.GAIA_INTERNAL_ERROR);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GrootException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GrootException.java
index e94fdb40362f..ae82c659ebe2 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GrootException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GrootException.java
@@ -15,20 +15,31 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
-import com.alibaba.graphscope.groot.common.util.ExceptionUtils;
+import com.alibaba.graphscope.proto.Code;
 
 public class GrootException extends RuntimeException {
+    private final int componentCode = 6;
 
     private int errorCode;
 
-    public GrootException(ExceptionUtils.ErrorCode code, String msg) {
+    public GrootException(Code code) {
+        super();
+        this.errorCode = code.getNumber();
+    }
+
+    public GrootException(Code code, Throwable t) {
+        super(t);
+        this.errorCode = code.getNumber();
+    }
+
+    public GrootException(Code code, String msg) {
         super(msg);
-        this.errorCode = code.toInt();
+        this.errorCode = code.getNumber();
     }
 
-    public GrootException(ExceptionUtils.ErrorCode code, Throwable e, String msg) {
-        super(msg, e);
-        this.errorCode = code.toInt();
+    public GrootException(Code code, String msg, Throwable t) {
+        super(msg, t);
+        this.errorCode = code.getNumber();
     }
 
     public int getErrorCode() {
@@ -54,4 +65,10 @@ public GrootException(String msg, Throwable t) {
     public GrootException() {
         super();
     }
+
+    @Override
+    public String getMessage() {
+        String ec = String.format("%02d-%04d", componentCode, errorCode);
+        return String.format("ec=%s, %s", ec, super.getMessage());
+    }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphPropertyNotFoundException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalSchemaException.java
similarity index 60%
rename from interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphPropertyNotFoundException.java
rename to interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalSchemaException.java
index 88bc566b45c2..d650e3921794 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphPropertyNotFoundException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalSchemaException.java
@@ -15,20 +15,23 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
-public class GraphPropertyNotFoundException extends GraphSchemaException {
-    public GraphPropertyNotFoundException() {
-        super();
+import com.alibaba.graphscope.proto.Code;
+
+public class IllegalSchemaException extends GrootException {
+
+    public IllegalSchemaException(String msg) {
+        super(Code.ILLEGAL_SCHEMA, msg);
     }
 
-    public GraphPropertyNotFoundException(Exception exception) {
-        super(exception);
+    public IllegalSchemaException(String msg, Throwable t) {
+        super(Code.ILLEGAL_SCHEMA, msg, t);
     }
 
-    public GraphPropertyNotFoundException(String message) {
-        super(message);
+    public IllegalSchemaException() {
+        super(Code.ILLEGAL_SCHEMA);
     }
 
-    public GraphPropertyNotFoundException(String message, Exception exception) {
-        super(message, exception);
+    public IllegalSchemaException(Throwable t) {
+        super(Code.ILLEGAL_SCHEMA, t);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalStateException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalStateException.java
new file mode 100644
index 000000000000..8ee044072dfc
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IllegalStateException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class IllegalStateException extends GrootException {
+    public IllegalStateException(Throwable t) {
+        super(Code.ILLEGAL_STATE, t);
+    }
+
+    public IllegalStateException(String msg) {
+        super(Code.ILLEGAL_STATE, msg);
+    }
+
+    public IllegalStateException(String msg, Throwable t) {
+        super(Code.ILLEGAL_STATE, msg, t);
+    }
+
+    public IllegalStateException() {
+        super(Code.ILLEGAL_STATE);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IngestRejectException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IngestRejectException.java
deleted file mode 100644
index bb0be06347c3..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/IngestRejectException.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class IngestRejectException extends GrootException {
-
-    public IngestRejectException(String msg) {
-        super(msg);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InternalException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InternalException.java
new file mode 100644
index 000000000000..c7d916411165
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InternalException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class InternalException extends GrootException {
+    public InternalException(Throwable t) {
+        super(Code.INTERNAL, t);
+    }
+
+    public InternalException(String msg) {
+        super(Code.INTERNAL, msg);
+    }
+
+    public InternalException(String msg, Throwable t) {
+        super(Code.INTERNAL, msg, t);
+    }
+
+    public InternalException() {
+        super(Code.INTERNAL);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidArgumentException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidArgumentException.java
new file mode 100644
index 000000000000..d3fc44281b36
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidArgumentException.java
@@ -0,0 +1,22 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class InvalidArgumentException extends GrootException {
+
+    public InvalidArgumentException(Throwable t) {
+        super(Code.INVALID_ARGUMENT, t);
+    }
+
+    public InvalidArgumentException(String msg) {
+        super(Code.INVALID_ARGUMENT, msg);
+    }
+
+    public InvalidArgumentException(String msg, Throwable t) {
+        super(Code.INVALID_ARGUMENT, msg, t);
+    }
+
+    public InvalidArgumentException() {
+        super(Code.INVALID_ARGUMENT);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataException.java
index 6a6746ca580c..2aeeb444891f 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataException.java
@@ -15,9 +15,23 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
+import com.alibaba.graphscope.proto.Code;
+
 public class InvalidDataException extends GrootException {
 
     public InvalidDataException(String msg) {
-        super(msg);
+        super(Code.INVALID_DATA, msg);
+    }
+
+    public InvalidDataException(String msg, Throwable t) {
+        super(Code.INVALID_DATA, msg, t);
+    }
+
+    public InvalidDataException() {
+        super(Code.INVALID_DATA);
+    }
+
+    public InvalidDataException(Throwable t) {
+        super(Code.INVALID_DATA, t);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataTypeException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataTypeException.java
new file mode 100644
index 000000000000..b5f32558f218
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidDataTypeException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class InvalidDataTypeException extends GrootException {
+    public InvalidDataTypeException(Throwable t) {
+        super(Code.INVALID_DATA_TYPE, t);
+    }
+
+    public InvalidDataTypeException(String msg) {
+        super(Code.INVALID_DATA_TYPE, msg);
+    }
+
+    public InvalidDataTypeException(String msg, Throwable t) {
+        super(Code.INVALID_DATA_TYPE, msg, t);
+    }
+
+    public InvalidDataTypeException() {
+        super(Code.INVALID_DATA_TYPE);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidOperationException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidOperationException.java
new file mode 100644
index 000000000000..df06fc0cebc6
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidOperationException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class InvalidOperationException extends GrootException {
+    public InvalidOperationException(Throwable t) {
+        super(Code.INVALID_OPERATION, t);
+    }
+
+    public InvalidOperationException(String msg) {
+        super(Code.INVALID_OPERATION, msg);
+    }
+
+    public InvalidOperationException(String msg, Throwable t) {
+        super(Code.INVALID_OPERATION, msg, t);
+    }
+
+    public InvalidOperationException() {
+        super(Code.INVALID_OPERATION);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidSchemaException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidSchemaException.java
deleted file mode 100644
index 3faffc91107c..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/InvalidSchemaException.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class InvalidSchemaException extends GrootException {
-
-    public InvalidSchemaException(String msg) {
-        super(msg);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/JSONException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/JSONException.java
deleted file mode 100644
index 836ba9bd6d8a..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/JSONException.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class JSONException extends RuntimeException {
-
-    public JSONException(String msg) {
-        super(msg);
-    }
-
-    public JSONException(String msg, Throwable e) {
-        super(msg, e);
-    }
-
-    public JSONException(Throwable e) {
-        super(e);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/LockFailedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/LockFailedException.java
new file mode 100644
index 000000000000..a39c56ce7ecb
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/LockFailedException.java
@@ -0,0 +1,22 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class LockFailedException extends GrootException {
+
+    public LockFailedException(Throwable t) {
+        super(Code.LOCK_FAILED, t);
+    }
+
+    public LockFailedException(String msg) {
+        super(Code.LOCK_FAILED, msg);
+    }
+
+    public LockFailedException(String msg, Throwable t) {
+        super(Code.LOCK_FAILED, msg, t);
+    }
+
+    public LockFailedException() {
+        super(Code.LOCK_FAILED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NetworkFailureException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NetworkFailureException.java
new file mode 100644
index 000000000000..b144bbb07a24
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NetworkFailureException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class NetworkFailureException extends GrootException {
+    public NetworkFailureException(Throwable t) {
+        super(Code.NETWORK_FAILURE, t);
+    }
+
+    public NetworkFailureException(String msg) {
+        super(Code.NETWORK_FAILURE, msg);
+    }
+
+    public NetworkFailureException(String msg, Throwable t) {
+        super(Code.NETWORK_FAILURE, msg, t);
+    }
+
+    public NetworkFailureException() {
+        super(Code.NETWORK_FAILURE);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NodeConnectException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NodeConnectException.java
deleted file mode 100644
index 29b0f598400a..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NodeConnectException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class NodeConnectException extends GrootException {
-    public NodeConnectException(String msg) {
-        super(msg);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NotFoundException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NotFoundException.java
new file mode 100644
index 000000000000..002eb2fe0720
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/NotFoundException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class NotFoundException extends GrootException {
+    public NotFoundException(Throwable t) {
+        super(Code.NOT_FOUND, t);
+    }
+
+    public NotFoundException(String msg) {
+        super(Code.NOT_FOUND, msg);
+    }
+
+    public NotFoundException(String msg, Throwable t) {
+        super(Code.NOT_FOUND, msg, t);
+    }
+
+    public NotFoundException() {
+        super(Code.NOT_FOUND);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PermissionDeniedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PermissionDeniedException.java
new file mode 100644
index 000000000000..d806aaaa3ec9
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PermissionDeniedException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class PermissionDeniedException extends GrootException {
+    public PermissionDeniedException(Throwable t) {
+        super(Code.PERMISSION_DENIED, t);
+    }
+
+    public PermissionDeniedException(String msg) {
+        super(Code.PERMISSION_DENIED, msg);
+    }
+
+    public PermissionDeniedException(String msg, Throwable t) {
+        super(Code.PERMISSION_DENIED, msg, t);
+    }
+
+    public PermissionDeniedException() {
+        super(Code.PERMISSION_DENIED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PortInUseException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PortInUseException.java
new file mode 100644
index 000000000000..06c102aa1f18
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PortInUseException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class PortInUseException extends GrootException {
+    public PortInUseException(Throwable t) {
+        super(Code.PORT_IN_USE, t);
+    }
+
+    public PortInUseException(String msg) {
+        super(Code.PORT_IN_USE, msg);
+    }
+
+    public PortInUseException(String msg, Throwable t) {
+        super(Code.PORT_IN_USE, msg, t);
+    }
+
+    public PortInUseException() {
+        super(Code.PORT_IN_USE);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyDefNotFoundException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyDefNotFoundException.java
deleted file mode 100644
index b64f36a2fc2f..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyDefNotFoundException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class PropertyDefNotFoundException extends GrootException {
-    public PropertyDefNotFoundException(String msg) {
-        super(msg);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphSchemaException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyNotFoundException.java
similarity index 56%
rename from interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphSchemaException.java
rename to interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyNotFoundException.java
index 90fb8b225386..ef6a66b40077 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphSchemaException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/PropertyNotFoundException.java
@@ -15,20 +15,22 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
-public class GraphSchemaException extends GrootException {
-    public GraphSchemaException() {
-        super();
+import com.alibaba.graphscope.proto.Code;
+
+public class PropertyNotFoundException extends GrootException {
+    public PropertyNotFoundException() {
+        super(Code.PROPERTY_NOT_FOUND);
     }
 
-    public GraphSchemaException(Exception exception) {
-        super(exception);
+    public PropertyNotFoundException(Exception exception) {
+        super(Code.PROPERTY_NOT_FOUND, exception);
     }
 
-    public GraphSchemaException(String message) {
-        super(message);
+    public PropertyNotFoundException(String message) {
+        super(Code.PROPERTY_NOT_FOUND, message);
     }
 
-    public GraphSchemaException(String message, Exception exception) {
-        super(message, exception);
+    public PropertyNotFoundException(String message, Exception exception) {
+        super(Code.PROPERTY_NOT_FOUND, message, exception);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueryFailedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueryFailedException.java
new file mode 100644
index 000000000000..117c941fbdec
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueryFailedException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class QueryFailedException extends GrootException {
+    public QueryFailedException(Throwable t) {
+        super(Code.QUERY_FAILED, t);
+    }
+
+    public QueryFailedException(String msg) {
+        super(Code.QUERY_FAILED, msg);
+    }
+
+    public QueryFailedException(String msg, Throwable t) {
+        super(Code.QUERY_FAILED, msg, t);
+    }
+
+    public QueryFailedException() {
+        super(Code.QUERY_FAILED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueueRejectException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueueRejectException.java
index 2f7b26f0ba94..ae509cc7fa4b 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueueRejectException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/QueueRejectException.java
@@ -15,10 +15,22 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
-import com.alibaba.graphscope.groot.common.util.ExceptionUtils;
+import com.alibaba.graphscope.proto.Code;
 
 public class QueueRejectException extends GrootException {
     public QueueRejectException(String msg) {
-        super(ExceptionUtils.ErrorCode.QueueReject, msg);
+        super(Code.QUEUE_REJECT, msg);
+    }
+
+    public QueueRejectException(String msg, Throwable t) {
+        super(Code.QUEUE_REJECT, msg, t);
+    }
+
+    public QueueRejectException() {
+        super(Code.QUEUE_REJECT);
+    }
+
+    public QueueRejectException(Throwable t) {
+        super(Code.QUEUE_REJECT, t);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/RealtimeWriteFailedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/RealtimeWriteFailedException.java
new file mode 100644
index 000000000000..5ce8b96d56c7
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/RealtimeWriteFailedException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class RealtimeWriteFailedException extends GrootException {
+    public RealtimeWriteFailedException(Throwable t) {
+        super(Code.REALTIME_WRITE_FAILED, t);
+    }
+
+    public RealtimeWriteFailedException(String msg) {
+        super(Code.REALTIME_WRITE_FAILED, msg);
+    }
+
+    public RealtimeWriteFailedException(String msg, Throwable t) {
+        super(Code.REALTIME_WRITE_FAILED, msg, t);
+    }
+
+    public RealtimeWriteFailedException() {
+        super(Code.REALTIME_WRITE_FAILED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ResourceExhaustedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ResourceExhaustedException.java
new file mode 100644
index 000000000000..e8c9700df56c
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ResourceExhaustedException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class ResourceExhaustedException extends GrootException {
+    public ResourceExhaustedException(Throwable t) {
+        super(Code.RESOURCE_EXHAUSTED, t);
+    }
+
+    public ResourceExhaustedException(String msg) {
+        super(Code.RESOURCE_EXHAUSTED, msg);
+    }
+
+    public ResourceExhaustedException(String msg, Throwable t) {
+        super(Code.RESOURCE_EXHAUSTED, msg, t);
+    }
+
+    public ResourceExhaustedException() {
+        super(Code.RESOURCE_EXHAUSTED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ServiceNotReadyException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ServiceNotReadyException.java
index 6e1f293f7676..e8f479626f59 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ServiceNotReadyException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ServiceNotReadyException.java
@@ -15,8 +15,22 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
+import com.alibaba.graphscope.proto.Code;
+
 public class ServiceNotReadyException extends GrootException {
     public ServiceNotReadyException(String msg) {
-        super(msg);
+        super(Code.SERVICE_NOT_READY, msg);
+    }
+
+    public ServiceNotReadyException(String msg, Throwable t) {
+        super(Code.SERVICE_NOT_READY, msg, t);
+    }
+
+    public ServiceNotReadyException() {
+        super(Code.SERVICE_NOT_READY);
+    }
+
+    public ServiceNotReadyException(Throwable t) {
+        super(Code.SERVICE_NOT_READY, t);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TimeoutException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TimeoutException.java
new file mode 100644
index 000000000000..604b64810b9e
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TimeoutException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class TimeoutException extends GrootException {
+    public TimeoutException(Throwable t) {
+        super(Code.TIMEOUT, t);
+    }
+
+    public TimeoutException(String msg) {
+        super(Code.TIMEOUT, msg);
+    }
+
+    public TimeoutException(String msg, Throwable t) {
+        super(Code.TIMEOUT, msg, t);
+    }
+
+    public TimeoutException() {
+        super(Code.TIMEOUT);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TooManyVersionsException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TooManyVersionsException.java
new file mode 100644
index 000000000000..4db9b136a571
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TooManyVersionsException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class TooManyVersionsException extends GrootException {
+    public TooManyVersionsException(Throwable t) {
+        super(Code.TOO_MANY_VERSIONS, t);
+    }
+
+    public TooManyVersionsException(String msg) {
+        super(Code.TOO_MANY_VERSIONS, msg);
+    }
+
+    public TooManyVersionsException(String msg, Throwable t) {
+        super(Code.TOO_MANY_VERSIONS, msg, t);
+    }
+
+    public TooManyVersionsException() {
+        super(Code.TOO_MANY_VERSIONS);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeDefNotFoundException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeDefNotFoundException.java
deleted file mode 100644
index ce53886b679a..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeDefNotFoundException.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.exception;
-
-public class TypeDefNotFoundException extends GrootException {
-    public TypeDefNotFoundException(String msg) {
-        super(msg);
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphElementNotFoundException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeNotFoundException.java
similarity index 60%
rename from interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphElementNotFoundException.java
rename to interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeNotFoundException.java
index 13a7a178fcf8..4d04bd6294a2 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/GraphElementNotFoundException.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/TypeNotFoundException.java
@@ -15,20 +15,23 @@
  */
 package com.alibaba.graphscope.groot.common.exception;
 
-public class GraphElementNotFoundException extends GraphSchemaException {
-    public GraphElementNotFoundException() {
-        super();
+import com.alibaba.graphscope.proto.Code;
+
+public class TypeNotFoundException extends GrootException {
+
+    public TypeNotFoundException(Throwable t) {
+        super(Code.TYPE_NOT_FOUND, t);
     }
 
-    public GraphElementNotFoundException(Exception exception) {
-        super(exception);
+    public TypeNotFoundException(String message) {
+        super(Code.TYPE_NOT_FOUND, message);
     }
 
-    public GraphElementNotFoundException(String message) {
-        super(message);
+    public TypeNotFoundException(String msg, Throwable t) {
+        super(Code.TYPE_NOT_FOUND, msg, t);
     }
 
-    public GraphElementNotFoundException(String message, Exception exception) {
-        super(message, exception);
+    public TypeNotFoundException() {
+        super(Code.TYPE_NOT_FOUND);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnimplementedException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnimplementedException.java
new file mode 100644
index 000000000000..536b1995cf25
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnimplementedException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class UnimplementedException extends GrootException {
+    public UnimplementedException(Throwable t) {
+        super(Code.UNIMPLEMENTED, t);
+    }
+
+    public UnimplementedException(String msg) {
+        super(Code.UNIMPLEMENTED, msg);
+    }
+
+    public UnimplementedException(String msg, Throwable t) {
+        super(Code.UNIMPLEMENTED, msg, t);
+    }
+
+    public UnimplementedException() {
+        super(Code.UNIMPLEMENTED);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnsupportedOperationException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnsupportedOperationException.java
new file mode 100644
index 000000000000..96c5bd10d4d5
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/UnsupportedOperationException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class UnsupportedOperationException extends GrootException {
+    public UnsupportedOperationException(Throwable t) {
+        super(Code.UNSUPPORTED_OPERATION, t);
+    }
+
+    public UnsupportedOperationException(String msg) {
+        super(Code.UNSUPPORTED_OPERATION, msg);
+    }
+
+    public UnsupportedOperationException(String msg, Throwable t) {
+        super(Code.UNSUPPORTED_OPERATION, msg, t);
+    }
+
+    public UnsupportedOperationException() {
+        super(Code.UNSUPPORTED_OPERATION);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ValueTypeMismatchException.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ValueTypeMismatchException.java
new file mode 100644
index 000000000000..e96981735938
--- /dev/null
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/exception/ValueTypeMismatchException.java
@@ -0,0 +1,21 @@
+package com.alibaba.graphscope.groot.common.exception;
+
+import com.alibaba.graphscope.proto.Code;
+
+public class ValueTypeMismatchException extends GrootException {
+    public ValueTypeMismatchException(Throwable t) {
+        super(Code.VALUE_TYPE_MISMATCH, t);
+    }
+
+    public ValueTypeMismatchException(String msg) {
+        super(Code.VALUE_TYPE_MISMATCH, msg);
+    }
+
+    public ValueTypeMismatchException(String msg, Throwable t) {
+        super(Code.VALUE_TYPE_MISMATCH, msg, t);
+    }
+
+    public ValueTypeMismatchException() {
+        super(Code.VALUE_TYPE_MISMATCH);
+    }
+}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataType.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataType.java
index 009bdabe6947..38680dc11d2b 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataType.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataType.java
@@ -16,7 +16,8 @@
 package com.alibaba.graphscope.groot.common.meta;
 
 import com.alibaba.graphscope.groot.common.exception.GrootException;
-import com.alibaba.graphscope.groot.common.util.ExceptionUtils;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
+import com.alibaba.graphscope.groot.common.exception.InvalidDataTypeException;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonValue;
@@ -89,8 +90,7 @@ public void setExpression(String expression) throws GrootException {
         }
 
         if (!isValid(expression)) {
-            throw new GrootException(
-                    ExceptionUtils.ErrorCode.DataTypeNotValid,
+            throw new InvalidDataTypeException(
                     "expression is not valid, subType "
                             + "must be primitiveTypes: "
                             + InternalDataType.primitiveTypes);
@@ -170,7 +170,7 @@ public int getFixedSize() {
             case DOUBLE:
                 return 8;
             default:
-                throw new RuntimeException("unreachable!");
+                throw new InternalException("unreachable!");
         }
     }
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeDeserializer.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeDeserializer.java
index 258fbb161a62..392eaeb09569 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeDeserializer.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeDeserializer.java
@@ -16,13 +16,11 @@
 package com.alibaba.graphscope.groot.common.meta;
 
 import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InvalidDataException;
 import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
 
-import java.io.IOException;
-
 public class DataTypeDeserializer extends StdDeserializer<DataType> {
     public DataTypeDeserializer() {
         this(null);
@@ -33,11 +31,10 @@ public DataTypeDeserializer(Class<?> vc) {
     }
 
     @Override
-    public DataType deserialize(JsonParser p, DeserializationContext ctxt)
-            throws IOException, JsonProcessingException {
+    public DataType deserialize(JsonParser p, DeserializationContext ctxt) throws GrootException {
         // todo: only support List<T> and Set<T> currently.
-        String data = p.getValueAsString();
         try {
+            String data = p.getValueAsString();
             if (data.startsWith("LIST<")) {
                 DataType ret = new DataType(InternalDataType.LIST);
                 ret.setExpression(data.substring("LIST<".length(), data.length() - 1));
@@ -52,8 +49,8 @@ public DataType deserialize(JsonParser p, DeserializationContext ctxt)
                 DataType ret = new DataType(InternalDataType.valueOf(data.toUpperCase()));
                 return ret;
             }
-        } catch (GrootException ex) {
-            throw new IOException(ex);
+        } catch (Exception ex) {
+            throw new InvalidDataException(ex);
         }
         return null;
     }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeSerializer.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeSerializer.java
index b95ec59a3efd..a24529c362c6 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeSerializer.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/meta/DataTypeSerializer.java
@@ -15,6 +15,8 @@
  */
 package com.alibaba.graphscope.groot.common.meta;
 
+import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InvalidDataTypeException;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
@@ -29,7 +31,7 @@ public DataTypeSerializer() {
 
     @Override
     public void serialize(DataType value, JsonGenerator gen, SerializerProvider provider)
-            throws IOException {
+            throws GrootException, IOException {
         if (value.isPrimitiveType()) {
             gen.writeString(value.name());
         } else {
@@ -41,7 +43,8 @@ public void serialize(DataType value, JsonGenerator gen, SerializerProvider prov
             } else if (value.getType().equals(InternalDataType.MAP)) {
                 prefix = "M";
             } else {
-                throw new IOException(String.format("unknown data type: %s", value.toString()));
+                throw new InvalidDataTypeException(
+                        String.format("unknown data type: %s", value.toString()));
             }
             gen.writeString(String.format("%s<%s>", prefix, value.getExpression()));
         }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/api/GraphSchema.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/api/GraphSchema.java
index d7b93df9ce77..c8b3c77d3dea 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/api/GraphSchema.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/api/GraphSchema.java
@@ -15,24 +15,24 @@
  */
 package com.alibaba.graphscope.groot.common.schema.api;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.GraphPropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.PropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 
 import java.util.List;
 import java.util.Map;
 
 public interface GraphSchema {
-    GraphElement getElement(String label) throws GraphElementNotFoundException;
+    GraphElement getElement(String label) throws TypeNotFoundException;
 
-    GraphElement getElement(int labelId) throws GraphElementNotFoundException;
+    GraphElement getElement(int labelId) throws TypeNotFoundException;
 
     List<GraphVertex> getVertexList();
 
     List<GraphEdge> getEdgeList();
 
-    Integer getPropertyId(String propName) throws GraphPropertyNotFoundException;
+    Integer getPropertyId(String propName) throws PropertyNotFoundException;
 
-    String getPropertyName(int propId) throws GraphPropertyNotFoundException;
+    String getPropertyName(int propId) throws PropertyNotFoundException;
 
     Map<GraphElement, GraphProperty> getPropertyList(String propName);
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphEdge.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphEdge.java
index ca0fb6831079..ab06f41f4ae4 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphEdge.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphEdge.java
@@ -15,6 +15,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.impl;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.EdgeRelation;
 import com.alibaba.graphscope.groot.common.schema.api.GraphEdge;
 import com.alibaba.graphscope.groot.common.schema.api.GraphProperty;
@@ -117,7 +118,7 @@ public GraphProperty getProperty(int propId) {
             }
         }
 
-        throw new IllegalArgumentException("Invalid property id " + propId);
+        throw new InvalidArgumentException("Invalid property id " + propId);
     }
 
     @Override
@@ -128,7 +129,7 @@ public GraphProperty getProperty(String propName) {
             }
         }
 
-        throw new IllegalArgumentException("Invalid property name " + propName);
+        throw new InvalidArgumentException("Invalid property name " + propName);
     }
 
     @Override
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphSchema.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphSchema.java
index 0ae122a383cd..c3b2ac3f4a0c 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphSchema.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphSchema.java
@@ -15,8 +15,9 @@
  */
 package com.alibaba.graphscope.groot.common.schema.impl;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.GraphPropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+import com.alibaba.graphscope.groot.common.exception.PropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.EdgeRelation;
 import com.alibaba.graphscope.groot.common.schema.api.GraphEdge;
 import com.alibaba.graphscope.groot.common.schema.api.GraphElement;
@@ -55,23 +56,23 @@ public DefaultGraphSchema(
     }
 
     @Override
-    public GraphElement getElement(String label) throws GraphElementNotFoundException {
+    public GraphElement getElement(String label) throws TypeNotFoundException {
         if (vertexList.containsKey(label)) {
             return vertexList.get(label);
         } else if (edgeList.containsKey(label)) {
             return edgeList.get(label);
         }
 
-        throw new GraphElementNotFoundException("label " + label + " not exist");
+        throw new TypeNotFoundException("label " + label + " not exist");
     }
 
     @Override
-    public GraphElement getElement(int labelId) throws GraphElementNotFoundException {
+    public GraphElement getElement(int labelId) throws TypeNotFoundException {
         if (idToLabelList.containsKey(labelId)) {
             return getElement(idToLabelList.get(labelId));
         }
 
-        throw new GraphElementNotFoundException("label not exist for label ID " + labelId);
+        throw new TypeNotFoundException("label not exist for label ID " + labelId);
     }
 
     @Override
@@ -85,22 +86,22 @@ public List<GraphEdge> getEdgeList() {
     }
 
     @Override
-    public Integer getPropertyId(String propName) throws GraphPropertyNotFoundException {
+    public Integer getPropertyId(String propName) throws PropertyNotFoundException {
         if (propNameToIdList.containsKey(propName)) {
             return propNameToIdList.get(propName);
         }
 
-        throw new GraphPropertyNotFoundException("property " + propName + " not exist");
+        throw new PropertyNotFoundException("property " + propName + " not exist");
     }
 
     @Override
-    public String getPropertyName(int propId) throws GraphPropertyNotFoundException {
+    public String getPropertyName(int propId) throws PropertyNotFoundException {
         for (Map.Entry<String, Integer> entry : propNameToIdList.entrySet()) {
             if (entry.getValue() == propId) {
                 return entry.getKey();
             }
         }
-        throw new GraphPropertyNotFoundException("property not exist for property id " + propId);
+        throw new PropertyNotFoundException("property not exist for property id " + propId);
     }
 
     @Override
@@ -223,7 +224,7 @@ public static GraphSchema buildSchemaFromJson(String schemaJson) {
             return new DefaultGraphSchema(vertexList, edgeList, propNameToIdList);
 
         } catch (JsonProcessingException e) {
-            throw new RuntimeException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphVertex.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphVertex.java
index 483f139610eb..0085f0fa5bbc 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphVertex.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/impl/DefaultGraphVertex.java
@@ -15,6 +15,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.impl;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphProperty;
 import com.alibaba.graphscope.groot.common.schema.api.GraphVertex;
 import com.alibaba.graphscope.groot.common.schema.wrapper.TypeDef;
@@ -104,7 +105,7 @@ public GraphProperty getProperty(int propId) {
                 return graphProperty;
             }
         }
-        throw new IllegalArgumentException("Can't get graph property for id " + propId);
+        throw new InvalidArgumentException("Can't get graph property for id " + propId);
     }
 
     @Override
@@ -114,7 +115,7 @@ public GraphProperty getProperty(String propName) {
                 return graphProperty;
             }
         }
-        throw new IllegalArgumentException("Can't get graph property for name " + propName);
+        throw new InvalidArgumentException("Can't get graph property for name " + propName);
     }
 
     @Override
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/EdgeTypeMapper.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/EdgeTypeMapper.java
index 4e42b63006af..1848370be956 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/EdgeTypeMapper.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/EdgeTypeMapper.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.mapper;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.EdgeRelation;
 import com.alibaba.graphscope.groot.common.schema.api.GraphEdge;
 import com.alibaba.graphscope.groot.common.schema.api.GraphProperty;
@@ -93,7 +94,7 @@ public GraphEdge toEdgeType(Map<String, GraphVertex> vertexTypeMap) {
         List<String> primaryKeyList = new ArrayList<>();
         if (indexes != null && indexes.size() > 0) {
             if (indexes.size() > 1) {
-                throw new IllegalArgumentException(
+                throw new InvalidArgumentException(
                         "Only support primary key now for " + this.indexes);
             }
             primaryKeyList = indexes.get(0).getPropertyNames();
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/GraphSchemaMapper.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/GraphSchemaMapper.java
index f28a2f0f57d5..febb0f953150 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/GraphSchemaMapper.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/GraphSchemaMapper.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.mapper;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphEdge;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
 import com.alibaba.graphscope.groot.common.schema.api.GraphVertex;
@@ -70,7 +71,7 @@ public String toJsonString() {
         try {
             return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(this);
         } catch (JsonProcessingException e) {
-            throw new IllegalArgumentException("convert graph schema to json failed", e);
+            throw new InvalidArgumentException("convert graph schema to json failed", e);
         }
     }
 
@@ -113,7 +114,7 @@ public static GraphSchemaMapper parseFromJson(String schemaJson) {
             }
             return graphSchema;
         } catch (JsonProcessingException e) {
-            throw new RuntimeException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/VertexTypeMapper.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/VertexTypeMapper.java
index cd3d2cd2fe7c..b29408c012fb 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/VertexTypeMapper.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/mapper/VertexTypeMapper.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.mapper;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphProperty;
 import com.alibaba.graphscope.groot.common.schema.api.GraphVertex;
 import com.alibaba.graphscope.groot.common.schema.impl.DefaultGraphVertex;
@@ -74,7 +75,7 @@ public GraphVertex toVertexType() {
                         .collect(Collectors.toList());
         /// TODO only support primary key now
         if (this.indexes.size() > 1) {
-            throw new IllegalArgumentException("Only support primary key now for " + this.indexes);
+            throw new InvalidArgumentException("Only support primary key now for " + this.indexes);
         }
         List<String> primaryKeyList = indexes.get(0).getPropertyNames();
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Graph.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Graph.java
index 4578f637da05..1015e3149350 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Graph.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Graph.java
@@ -1,7 +1,7 @@
 package com.alibaba.graphscope.groot.common.schema.unified;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.GraphPropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.PropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -39,7 +39,7 @@ public String toString() {
     }
 
     @Override
-    public GraphElement getElement(String label) throws GraphElementNotFoundException {
+    public GraphElement getElement(String label) throws TypeNotFoundException {
         for (Type type : schema.vertexTypes) {
             if (Objects.equals(type.getLabel(), label)) {
                 return type;
@@ -54,7 +54,7 @@ public GraphElement getElement(String label) throws GraphElementNotFoundExceptio
     }
 
     @Override
-    public GraphElement getElement(int labelId) throws GraphElementNotFoundException {
+    public GraphElement getElement(int labelId) throws TypeNotFoundException {
         for (Type type : schema.vertexTypes) {
             if (type.getLabelId() == labelId) {
                 return type;
@@ -81,7 +81,7 @@ public List<GraphEdge> getEdgeList() {
     }
 
     @Override
-    public Integer getPropertyId(String propName) throws GraphPropertyNotFoundException {
+    public Integer getPropertyId(String propName) throws PropertyNotFoundException {
         for (Type type : schema.vertexTypes) {
             for (GraphProperty property : type.getPropertyList()) {
                 if (Objects.equals(property.getName(), propName)) {
@@ -100,7 +100,7 @@ public Integer getPropertyId(String propName) throws GraphPropertyNotFoundExcept
     }
 
     @Override
-    public String getPropertyName(int propId) throws GraphPropertyNotFoundException {
+    public String getPropertyName(int propId) throws PropertyNotFoundException {
         for (Type type : schema.vertexTypes) {
             for (GraphProperty property : type.getPropertyList()) {
                 if (Objects.equals(property.getId(), propId)) {
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/PropertyType.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/PropertyType.java
index 9ca73279d900..a49a0cd0e4f1 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/PropertyType.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/PropertyType.java
@@ -1,5 +1,6 @@
 package com.alibaba.graphscope.groot.common.schema.unified;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidDataTypeException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.DataType;
 
 public class PropertyType {
@@ -39,6 +40,6 @@ public DataType toImpl() {
                     return DataType.DOUBLE;
             }
         }
-        throw new RuntimeException("Cannot parse propertyType " + this);
+        throw new InvalidDataTypeException("Cannot parse propertyType " + this);
     }
 }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Schema.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Schema.java
index d2807a2485f6..9b67f9b8f8d3 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Schema.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/unified/Schema.java
@@ -1,7 +1,6 @@
 package com.alibaba.graphscope.groot.common.schema.unified;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.schema.api.*;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 
 import java.util.List;
 import java.util.Objects;
@@ -15,7 +14,7 @@ public String toString() {
         return "Schema{" + "vertexTypes=" + vertexTypes + ", edgeTypes=" + edgeTypes + '}';
     }
 
-    private VertexType getVertexType(String label) throws GraphElementNotFoundException {
+    private VertexType getVertexType(String label) throws TypeNotFoundException {
         for (VertexType type : vertexTypes) {
             if (Objects.equals(type.getLabel(), label)) {
                 return type;
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/DataType.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/DataType.java
index 3dbfe3920375..a2efedb712de 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/DataType.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/DataType.java
@@ -15,6 +15,8 @@
  */
 package com.alibaba.graphscope.groot.common.schema.wrapper;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidDataTypeException;
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 import com.alibaba.graphscope.groot.common.meta.InternalDataType;
 import com.alibaba.graphscope.proto.groot.DataTypePb;
 
@@ -49,7 +51,7 @@ public enum DataType {
 
     public static DataType fromId(byte id) {
         if (id < 0 || id >= TYPES.length) {
-            throw new IllegalArgumentException("Unknown DataType: [" + id + "]");
+            throw new InvalidDataTypeException("Unknown DataType: [" + id + "]");
         }
         return TYPES[id];
     }
@@ -182,14 +184,14 @@ public static DataType parseFromDataType(
                             }
                         default:
                             {
-                                throw new IllegalArgumentException(
+                                throw new InvalidDataTypeException(
                                         "Unsupported property data type " + dataType);
                             }
                     }
                 }
             default:
                 {
-                    throw new IllegalArgumentException(
+                    throw new InvalidDataTypeException(
                             "Unsupported property data type " + dataType);
                 }
         }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/GraphDef.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/GraphDef.java
index b304d180567b..ecf88536a1d6 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/GraphDef.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/GraphDef.java
@@ -13,10 +13,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.wrapper;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.GraphPropertyNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.InvalidSchemaException;
-import com.alibaba.graphscope.groot.common.exception.TypeDefNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.*;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.impl.DefaultEdgeRelation;
 import com.alibaba.graphscope.groot.common.schema.impl.DefaultGraphEdge;
@@ -101,7 +98,7 @@ private DefaultGraphEdge getEdgeType(TypeDef typeDef) {
                 GraphVertex dstGraphVertex = this.vertexTypes.get(edgeKind.getDstVertexLabelId());
                 Long tableId = edgeTableIds.get(edgeKind);
                 if (tableId == null) {
-                    throw new IllegalArgumentException("no valid table id for [" + edgeKind + "]");
+                    throw new InvalidArgumentException("no valid table id for [" + edgeKind + "]");
                 }
                 edgeRelations.add(new DefaultEdgeRelation(srcGraphVertex, dstGraphVertex, tableId));
             }
@@ -124,7 +121,7 @@ private DefaultGraphVertex getVertexType(TypeDef typeDef) {
         LabelId labelId = typeDef.getTypeLabelId();
         Long tableId = vertexTableIds.get(labelId);
         if (tableId == null) {
-            throw new InvalidSchemaException("no valid table id for [" + typeDef.getLabel() + "]");
+            throw new IllegalSchemaException("no valid table id for [" + typeDef.getLabel() + "]");
         }
         return new DefaultGraphVertex(typeDef, tableId);
     }
@@ -224,7 +221,7 @@ public GraphDefPb toProto() {
     public TypeDef getTypeDef(String label) {
         LabelId labelId = this.labelToId.get(label);
         if (labelId == null) {
-            throw new TypeDefNotFoundException("no such label [" + label + "]");
+            throw new NotFoundException("no such label [" + label + "]");
         }
         return getTypeDef(labelId);
     }
@@ -250,30 +247,30 @@ public boolean hasEdgeKind(EdgeKind edgeKind) {
     }
 
     @Override
-    public GraphElement getElement(String label) throws GraphElementNotFoundException {
+    public GraphElement getElement(String label) throws TypeNotFoundException {
         LabelId labelId = labelToId.get(label);
         if (labelId == null) {
-            throw new GraphElementNotFoundException("schema element not found for label " + label);
+            throw new TypeNotFoundException("schema element not found for label " + label);
         }
         return convertVertexEdgeType(idToType.get(labelId));
     }
 
     @Override
-    public GraphElement getElement(int labelId) throws GraphElementNotFoundException {
+    public GraphElement getElement(int labelId) throws TypeNotFoundException {
         TypeDef typeDef = idToType.get(new LabelId(labelId));
         return convertVertexEdgeType(typeDef);
     }
 
     private GraphElement convertVertexEdgeType(TypeDef typeDef) {
         if (null == typeDef) {
-            throw new RuntimeException("No type def with given label id/name");
+            throw new InvalidArgumentException("No type def with given label id/name");
         }
         if (typeDef.getTypeEnum() == TypeEnum.VERTEX) {
             return getVertexType(typeDef);
         } else if (typeDef.getTypeEnum() == TypeEnum.EDGE) {
             return getEdgeType(typeDef);
         } else {
-            throw new IllegalArgumentException("Not support type value " + typeDef.getTypeEnum());
+            throw new InvalidArgumentException("Not support type value " + typeDef.getTypeEnum());
         }
     }
 
@@ -288,23 +285,22 @@ public List<GraphEdge> getEdgeList() {
     }
 
     @Override
-    public Integer getPropertyId(String propertyName) throws GraphPropertyNotFoundException {
+    public Integer getPropertyId(String propertyName) throws PropertyNotFoundException {
         if (propertyNameToId.containsKey(propertyName)) {
             return propertyNameToId.get(propertyName);
         }
 
-        throw new GraphPropertyNotFoundException("property " + propertyName + " not exist");
+        throw new PropertyNotFoundException("property " + propertyName + " not exist");
     }
 
     @Override
-    public String getPropertyName(int propertyId) throws GraphPropertyNotFoundException {
+    public String getPropertyName(int propertyId) throws PropertyNotFoundException {
         for (Map.Entry<String, Integer> entry : propertyNameToId.entrySet()) {
             if (entry.getValue() == propertyId) {
                 return entry.getKey();
             }
         }
-        throw new GraphPropertyNotFoundException(
-                "property not exist for property id " + propertyId);
+        throw new PropertyNotFoundException("property not exist for property id " + propertyId);
     }
 
     @Override
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/PropertyValue.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/PropertyValue.java
index 8a7bff731556..0ee6eda7e8b7 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/PropertyValue.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/PropertyValue.java
@@ -13,6 +13,8 @@
  */
 package com.alibaba.graphscope.groot.common.schema.wrapper;
 
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.proto.groot.PropertyValuePb;
 import com.google.protobuf.ByteString;
 
@@ -64,7 +66,7 @@ private static Object stringToObj(DataType dataType, Object val) {
                     throw new IllegalStateException("Unexpected value: " + dataType);
             }
         } catch (Exception e) {
-            throw new IllegalArgumentException(
+            throw new InvalidArgumentException(
                     "unable to parse object to bytes. DataType ["
                             + dataType
                             + "], Object ["
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/SerdeUtils.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/SerdeUtils.java
index b08c9646bb66..f26007ead022 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/SerdeUtils.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/SerdeUtils.java
@@ -13,6 +13,9 @@
  */
 package com.alibaba.graphscope.groot.common.schema.wrapper;
 
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
@@ -73,7 +76,7 @@ public static byte[] objectToBytes(DataType dataType, Object valObject) {
                                 try {
                                     dos.writeInt(e);
                                 } catch (IOException ex) {
-                                    throw new IllegalArgumentException("write to bytes failed", ex);
+                                    throw new InvalidArgumentException("write to bytes failed", ex);
                                 }
                                 return null;
                             });
@@ -89,7 +92,7 @@ public static byte[] objectToBytes(DataType dataType, Object valObject) {
                                 try {
                                     dos.writeLong(e);
                                 } catch (IOException ex) {
-                                    throw new IllegalArgumentException("write to bytes failed", ex);
+                                    throw new InvalidArgumentException("write to bytes failed", ex);
                                 }
                                 return null;
                             });
@@ -105,7 +108,7 @@ public static byte[] objectToBytes(DataType dataType, Object valObject) {
                                 try {
                                     dos.writeFloat(e);
                                 } catch (IOException ex) {
-                                    throw new IllegalArgumentException("write to bytes failed", ex);
+                                    throw new InvalidArgumentException("write to bytes failed", ex);
                                 }
                                 return null;
                             });
@@ -121,7 +124,7 @@ public static byte[] objectToBytes(DataType dataType, Object valObject) {
                                 try {
                                     dos.writeDouble(e);
                                 } catch (IOException ex) {
-                                    throw new IllegalArgumentException("write to bytes failed", ex);
+                                    throw new InvalidArgumentException("write to bytes failed", ex);
                                 }
                                 return null;
                             });
@@ -149,7 +152,7 @@ public static byte[] objectToBytes(DataType dataType, Object valObject) {
                     throw new IllegalStateException("Unexpected value: " + dataType);
             }
         } catch (Exception e) {
-            throw new IllegalArgumentException(
+            throw new InvalidArgumentException(
                     "unable to parse object to bytes. DataType ["
                             + dataType
                             + "], Object ["
@@ -200,7 +203,7 @@ public static Object bytesToObject(DataType dataType, byte[] valBytes) {
                                         try {
                                             return dis.readInt();
                                         } catch (IOException e) {
-                                            throw new IllegalArgumentException(
+                                            throw new InvalidArgumentException(
                                                     "parse val failed", e);
                                         }
                                     });
@@ -213,7 +216,7 @@ public static Object bytesToObject(DataType dataType, byte[] valBytes) {
                                         try {
                                             return dis.readLong();
                                         } catch (IOException e) {
-                                            throw new IllegalArgumentException(
+                                            throw new InvalidArgumentException(
                                                     "parse val failed", e);
                                         }
                                     });
@@ -226,7 +229,7 @@ public static Object bytesToObject(DataType dataType, byte[] valBytes) {
                                         try {
                                             return dis.readFloat();
                                         } catch (IOException e) {
-                                            throw new IllegalArgumentException(
+                                            throw new InvalidArgumentException(
                                                     "parse val failed", e);
                                         }
                                     });
@@ -239,7 +242,7 @@ public static Object bytesToObject(DataType dataType, byte[] valBytes) {
                                         try {
                                             return dis.readDouble();
                                         } catch (IOException e) {
-                                            throw new IllegalArgumentException(
+                                            throw new InvalidArgumentException(
                                                     "parse val failed", e);
                                         }
                                     });
@@ -267,7 +270,7 @@ public static Object bytesToObject(DataType dataType, byte[] valBytes) {
             }
             return valObject;
         } catch (IOException e) {
-            throw new IllegalArgumentException("parse val failed", e);
+            throw new InvalidArgumentException("parse val failed", e);
         }
     }
 
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/TypeEnum.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/TypeEnum.java
index 7baa9e109f9d..b7f80a5b162c 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/TypeEnum.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/schema/wrapper/TypeEnum.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.common.schema.wrapper;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.proto.groot.TypeEnumPb;
 
 public enum TypeEnum {
@@ -30,7 +31,7 @@ public enum TypeEnum {
 
     public static TypeEnum fromId(byte id) {
         if (id < 0 || id >= ALL.length) {
-            throw new IllegalArgumentException("Unknown TypeEnum: [" + id + "]");
+            throw new InvalidArgumentException("Unknown TypeEnum: [" + id + "]");
         }
         return ALL[id];
     }
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/ExceptionUtils.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/ExceptionUtils.java
deleted file mode 100644
index 4db49b329f59..000000000000
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/ExceptionUtils.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * Licensed 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 com.alibaba.graphscope.groot.common.util;
-
-import com.alibaba.graphscope.groot.common.exception.GrootException;
-import com.alibaba.graphscope.groot.common.exception.QueueRejectException;
-
-public class ExceptionUtils {
-
-    public enum ErrorCode {
-        OK(0),
-        PropertyAlreadyExist(1000),
-        PropertyNotExist(1001),
-        TypeAlreadyExist(1002),
-        TypeNotFound(1003),
-        RelationShipExistWithType(1004),
-        RelationShipAlreadyExist(1005),
-        PropertyNameAlreadyExist(1006),
-        UnSupportedMetaOperation(1007),
-        PropertyExistInType(1008),
-        SchemaPersistentError(1009),
-        DataTypeNotValid(1010),
-        DefaultValueNotMatchDataType(1011),
-        DefaultValueNotSupportedForDataType(1012),
-        RelationShipNotExist(1013),
-        InvalidTypeChanged(1014),
-
-        IndexCanBeUsedOnlyOnEdge(1100),
-        IndexTypeMustUnique(1101),
-
-        // client-frontend related
-        IllegalSession(2000),
-        FrontendServiceBusy(2001),
-        SessionTimeout(2002),
-        RealtimeWriteFailed(2003),
-        ServiceNotReady(2004),
-        RealtimeDataNotValid(2005),
-        QueueReject(2006),
-
-        JobNotExist(3000),
-        JobIsTerminated(3001),
-        JobIsAlreadyInSnapshot(3002),
-        JobIdIsAlreadyExistInGraph(3003),
-        JobIdMustGreaterThanBefore(3004),
-        JobQueueIsFullForThisType(3005),
-
-        SnapshotPersistentError(4000),
-
-        // bulk load related
-        IllegalVertexLabel(5000),
-        IllegalEdgeLabel(5001),
-        IllegalSrcDstLabel(5002),
-        IllegalPlatform(5003),
-        IllegalStoreType(5004),
-        IllegalPrimaryKey(5005),
-        IllegalProperty(5006),
-        IllegalParameter(5007),
-        BuildDataFailed(5008),
-        OnlineDataFailed(5009),
-        SubmitBuildJobFailed(5010),
-        CancelBuildFailed(5011),
-        CancelOnlineFailed(5012),
-        CancelJobFailed(5013),
-        HttpRequestFailed(5014),
-
-        // frontend related
-        AuthenticationFailed(6000),
-        AuthorizationFailed(6001),
-
-        // studio related
-        @Deprecated
-        AkAuthenticatedFailed(7000),
-
-        UnsupportedFilter(7001),
-        InstanceNotFound(7002),
-        DeleteInstanceFailed(7003),
-        InvalidParams(7004),
-        CannotRename(7005),
-        ClusterNotFound(7006),
-        AddPackageVersionFailed(7007),
-        InstanceNameExist(7008),
-        OneAdminNeededByInstance(7009),
-        MonitorClusterFailed(7010),
-        MonitorInstanceFailed(7011),
-        ApiNoPermission(7012),
-        CreateVpcAlbFailed(7013),
-        DeleteVpcAlbFailed(7014),
-        NoAvailablePackage(7015),
-        AkAccessKeyNotFound(7016),
-        AkSignatureFailed(7017),
-        AkSignatureMethodUnSupported(7018),
-        AkTimestampIllegal(7019),
-        AkSignatureNotFound(7020),
-        AkParameterInvalid(7021),
-        AkClientNotConnected(7022),
-        InvalidInstanceName(7023),
-        ResourceInsufficient(7024),
-
-        Unknown(9999);
-
-        private final int value;
-
-        ErrorCode(int value) {
-            this.value = value;
-        }
-
-        public int toInt() {
-            return value;
-        }
-
-        public static ErrorCode fromInt(int code) {
-            for (ErrorCode errorCode : ErrorCode.class.getEnumConstants()) {
-                if (errorCode.toInt() == code) {
-                    return errorCode;
-                }
-            }
-
-            return ErrorCode.Unknown;
-        }
-    }
-
-    public static void checkAndThrow(int errCode, String errMsg) throws GrootException {
-        ErrorCode errorCode = ErrorCode.fromInt(errCode);
-        switch (errorCode) {
-            case OK:
-                return;
-            case Unknown:
-                throw new RuntimeException(errMsg);
-            case QueueReject:
-                throw new QueueRejectException(errMsg);
-            default:
-                throw new GrootException(errorCode, errMsg);
-        }
-    }
-}
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/IrSchemaParser.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/IrSchemaParser.java
index d3ef0202aeb9..ba3245eed174 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/IrSchemaParser.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/IrSchemaParser.java
@@ -16,6 +16,7 @@
 
 package com.alibaba.graphscope.groot.common.util;
 
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.wrapper.DataType;
 import com.google.common.collect.ImmutableMap;
diff --git a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/JSON.java b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/JSON.java
index 4e3c09510b38..482954386512 100644
--- a/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/JSON.java
+++ b/interactive_engine/common/src/main/java/com/alibaba/graphscope/groot/common/util/JSON.java
@@ -15,7 +15,7 @@
  */
 package com.alibaba.graphscope.groot.common.util;
 
-import com.alibaba.graphscope.groot.common.exception.JSONException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.*;
@@ -25,9 +25,6 @@
 import java.io.IOException;
 import java.util.List;
 
-/**
- * Created by wubincen on 2018/5/3
- */
 public class JSON {
 
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@@ -43,7 +40,7 @@ public static String toJson(Object object) {
         try {
             return OBJECT_MAPPER.writeValueAsString(object);
         } catch (JsonProcessingException e) {
-            throw new JSONException("JsonProcessingException : ", e);
+            throw new InvalidArgumentException("JsonProcessingException : ", e);
         }
     }
 
@@ -51,7 +48,7 @@ public static <T> T fromJson(String json, TypeReference<T> typeRef) throws Runti
         try {
             return (json == null || json.isEmpty()) ? null : OBJECT_MAPPER.readValue(json, typeRef);
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 
@@ -59,7 +56,7 @@ public static <T> T fromJson(String json, Class<T> valueType) {
         try {
             return OBJECT_MAPPER.readValue(json, valueType);
         } catch (IOException e) {
-            throw new JSONException("IOException : ", e);
+            throw new InvalidArgumentException("IOException : ", e);
         }
     }
 
@@ -67,7 +64,7 @@ public static JsonNode fromJson(String json) {
         try {
             return OBJECT_MAPPER.readTree(json);
         } catch (IOException e) {
-            throw new JSONException("IOException : ", e);
+            throw new InvalidArgumentException("IOException : ", e);
         }
     }
 
diff --git a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/GraphOptSchema.java b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/GraphOptSchema.java
index 1ec360b5b7e4..6b729d6d6e0d 100644
--- a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/GraphOptSchema.java
+++ b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/GraphOptSchema.java
@@ -16,7 +16,7 @@
 
 package com.alibaba.graphscope.common.ir.meta.schema;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphElement;
 
 import org.apache.calcite.plan.RelOptCluster;
@@ -57,7 +57,7 @@ public RelOptTable getTableForMember(List<String> tableName) {
         try {
             GraphElement element = rootSchema.getElement(labelName);
             return createRelOptTable(tableName, element);
-        } catch (GraphElementNotFoundException e) {
+        } catch (TypeNotFoundException e) {
             throw Static.RESOURCE.tableNotFound(labelName).ex();
         }
     }
diff --git a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/IrGraphSchema.java b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/IrGraphSchema.java
index 2a288da38e7a..351ad63a4c6a 100644
--- a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/IrGraphSchema.java
+++ b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/common/ir/meta/schema/IrGraphSchema.java
@@ -16,8 +16,8 @@
 
 package com.alibaba.graphscope.common.ir.meta.schema;
 
-import com.alibaba.graphscope.groot.common.exception.GraphElementNotFoundException;
-import com.alibaba.graphscope.groot.common.exception.GraphPropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.PropertyNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.TypeNotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.util.IrSchemaParser;
 
@@ -68,12 +68,12 @@ public String schemaJson() {
     }
 
     @Override
-    public GraphElement getElement(String s) throws GraphElementNotFoundException {
+    public GraphElement getElement(String s) throws TypeNotFoundException {
         return this.graphSchema.getElement(s);
     }
 
     @Override
-    public GraphElement getElement(int i) throws GraphElementNotFoundException {
+    public GraphElement getElement(int i) throws TypeNotFoundException {
         return this.graphSchema.getElement(i);
     }
 
@@ -88,12 +88,12 @@ public List<GraphEdge> getEdgeList() {
     }
 
     @Override
-    public Integer getPropertyId(String s) throws GraphPropertyNotFoundException {
+    public Integer getPropertyId(String s) throws PropertyNotFoundException {
         return this.graphSchema.getPropertyId(s);
     }
 
     @Override
-    public String getPropertyName(int i) throws GraphPropertyNotFoundException {
+    public String getPropertyName(int i) throws PropertyNotFoundException {
         return this.graphSchema.getPropertyName(i);
     }
 
diff --git a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/plugin/processor/LifeCycleSupplier.java b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/plugin/processor/LifeCycleSupplier.java
index 79691bc64cca..3a46c6fa408c 100644
--- a/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/plugin/processor/LifeCycleSupplier.java
+++ b/interactive_engine/compiler/src/main/java/com/alibaba/graphscope/gremlin/plugin/processor/LifeCycleSupplier.java
@@ -91,7 +91,7 @@ public GremlinExecutor.LifeCycle get() {
                                 GraphPlanner.Summary summary = value.summary;
                                 statusCallback
                                         .getQueryLogger()
-                                        .info("ir plan {}", summary.getPhysicalPlan().explain());
+                                        .debug("ir plan {}", summary.getPhysicalPlan().explain());
                                 ResultSchema resultSchema =
                                         new ResultSchema(summary.getLogicalPlan());
                                 GremlinResultProcessor listener =
diff --git a/interactive_engine/data-load-tool/pom.xml b/interactive_engine/data-load-tool/pom.xml
index 1fb46cff251c..599fee7d947e 100644
--- a/interactive_engine/data-load-tool/pom.xml
+++ b/interactive_engine/data-load-tool/pom.xml
@@ -90,22 +90,6 @@
       <groupId>com.aliyun.oss</groupId>
       <artifactId>aliyun-sdk-oss</artifactId>
     </dependency>
-
-    <dependency>
-      <groupId>org.apache.spark</groupId>
-      <artifactId>spark-core_${scala.binary.version}</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.spark</groupId>
-      <artifactId>spark-sql_${scala.binary.version}</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.scala-lang</groupId>
-      <artifactId>scala-library</artifactId>
-      <scope>provided</scope>
-    </dependency>
   </dependencies>
   <build>
     <plugins>
@@ -113,17 +97,6 @@
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
       </plugin>
-      <plugin>
-        <groupId>net.alchim31.maven</groupId>
-        <artifactId>scala-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>compile</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/DataCommand.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/DataCommand.java
index 613b8088a111..9dd4ffa47926 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/DataCommand.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/DataCommand.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.dataload;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
 import com.alibaba.graphscope.groot.common.schema.mapper.GraphSchemaMapper;
 import com.alibaba.graphscope.groot.dataload.databuild.ColumnMappingInfo;
@@ -54,7 +55,7 @@ private void initialize() throws IOException {
             }
             dataRootPath = outputPath;
         } else if (dataSinkType.equalsIgnoreCase("VOLUME")) {
-            throw new IOException(
+            throw new InvalidArgumentException(
                     "Volume only supports load.after.build mode, which is running build, ingest and"
                             + " commit at the same driver.");
         } else if (dataSinkType.equalsIgnoreCase("OSS")) {
@@ -64,7 +65,7 @@ private void initialize() throws IOException {
                 ingestConfig = fs.getConfig();
             }
         } else {
-            throw new IOException("Unsupported data sink: " + dataSinkType);
+            throw new InvalidArgumentException("Unsupported data sink: " + dataSinkType);
         }
 
         ObjectMapper objectMapper = new ObjectMapper();
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapper.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapper.java
index 0a7506bab3b0..5924e972588a 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapper.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapper.java
@@ -14,6 +14,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.mapper.GraphSchemaMapper;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyValue;
@@ -101,7 +102,7 @@ protected void map(LongWritable key, Text value, Context context)
             this.outKey.set(in.getArray(), in.getOffset(), in.getLength());
             context.write(this.outKey, this.outVal);
         } else {
-            throw new IllegalArgumentException("Invalid label " + labelId);
+            throw new InvalidArgumentException("Invalid label " + labelId);
         }
     }
 }
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdps.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdps.java
index 41352370704a..2b5f727053fc 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdps.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdps.java
@@ -16,6 +16,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.mapper.GraphSchemaMapper;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyValue;
@@ -99,7 +100,7 @@ public void map(long recordNum, Record record, TaskContext context) throws IOExc
             outKey.set(new Object[] {new String(in.getBytes(), charSet)});
             context.write(outKey, outVal);
         } else {
-            throw new IllegalArgumentException("Invalid label " + labelId);
+            throw new InvalidArgumentException("Invalid label " + labelId);
         }
     }
 }
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdpsDebug.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdpsDebug.java
index ba2b9a42577f..63e8cfe118cc 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdpsDebug.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildMapperOdpsDebug.java
@@ -16,6 +16,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.mapper.GraphSchemaMapper;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyValue;
@@ -94,7 +95,7 @@ public void map(long recordNum, Record record, TaskContext context) throws IOExc
             outKey.set(0, getEdgeKeyEncoded(in));
             context.write(outKey);
         } else {
-            throw new IllegalArgumentException("Invalid label " + labelId);
+            throw new InvalidArgumentException("Invalid label " + labelId);
         }
     }
 
@@ -111,7 +112,7 @@ private String getVertexRawKeys(GraphVertex type, Map<Integer, Integer> colMap,
         return concatenateItemsByIndices(items, indices);
     }
 
-    private String getEdgeRawKeys(ColumnMappingInfo info, String[] items) throws IOException {
+    private String getEdgeRawKeys(ColumnMappingInfo info, String[] items) {
         Map<Integer, Integer> srcPkColMap = info.getSrcPkColMap();
         Map<Integer, Integer> dstPkColMap = info.getDstPkColMap();
 
@@ -120,11 +121,10 @@ private String getEdgeRawKeys(ColumnMappingInfo info, String[] items) throws IOE
         return concatenateItemsByIndices(items, pkIds);
     }
 
-    private static String concatenateItemsByIndices(String[] array, List<Integer> indices)
-            throws IOException {
+    private static String concatenateItemsByIndices(String[] array, List<Integer> indices) {
         StringBuilder builder = new StringBuilder();
         if (indices.isEmpty()) {
-            throw new IOException("indices are empty!");
+            throw new InvalidArgumentException("indices are empty!");
         }
         for (int index : indices) {
             builder.append(array[index]).append(",");
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildPartitionerOdps.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildPartitionerOdps.java
index bf7c2658ea91..b4f4458ac977 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildPartitionerOdps.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildPartitionerOdps.java
@@ -15,6 +15,7 @@
  */
 package com.alibaba.graphscope.groot.dataload.databuild;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.util.PartitionUtils;
 import com.aliyun.odps.data.Record;
 import com.aliyun.odps.mapred.Partitioner;
@@ -35,7 +36,7 @@ public int getPartition(Record key, Record value, int numPartitions) {
         try {
             keyBytes = ((String) key.get(0)).getBytes(DataBuildMapperOdps.charSet);
         } catch (UnsupportedEncodingException e) {
-            throw new RuntimeException("PartitionerOdps: Should not have happened " + e);
+            throw new InvalidArgumentException("PartitionerOdps: Should not have happened " + e);
         }
         ByteBuffer keyBuf = ByteBuffer.wrap(keyBytes);
         long partitionKey = keyBuf.getLong(8);
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildReducerOdps.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildReducerOdps.java
index c32a8c53b2e0..addb84fabd28 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildReducerOdps.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/DataBuildReducerOdps.java
@@ -16,6 +16,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.dataload.util.AbstractFileSystem;
 import com.alibaba.graphscope.groot.dataload.util.FSFactory;
 import com.aliyun.odps.data.Record;
@@ -130,7 +131,7 @@ public String getFileMD5(String fileName) throws IOException {
             }
             return new String(Hex.encodeHex(MD5.digest()));
         } catch (NoSuchAlgorithmException | IOException e) {
-            throw new IOException(e);
+            throw new InvalidArgumentException(e);
         } finally {
             if (fis != null) {
                 fis.close();
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/FileColumnMapping.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/FileColumnMapping.java
index 05249d3d93c0..15a9c3ff6681 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/FileColumnMapping.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/FileColumnMapping.java
@@ -15,7 +15,7 @@
  */
 package com.alibaba.graphscope.groot.dataload.databuild;
 
-import com.alibaba.graphscope.groot.common.exception.InvalidSchemaException;
+import com.alibaba.graphscope.groot.common.exception.IllegalSchemaException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 
 import java.util.HashMap;
@@ -104,7 +104,7 @@ public ColumnMappingInfo toColumnMappingInfo(GraphSchema graphSchema) {
                             propertiesMap);
                 }
             }
-            throw new InvalidSchemaException(
+            throw new IllegalSchemaException(
                     "invalid mapping for label ["
                             + this.label
                             + "] srcLabel ["
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/OfflineBuildOdps.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/OfflineBuildOdps.java
index 252873f8bfff..7271d57f12b5 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/OfflineBuildOdps.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/OfflineBuildOdps.java
@@ -14,6 +14,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
 import com.alibaba.graphscope.groot.common.schema.mapper.GraphSchemaMapper;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
@@ -37,7 +38,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.util.*;
 
 public class OfflineBuildOdps {
@@ -161,9 +161,9 @@ public static void main(String[] args) throws Exception {
             String outputTable = properties.getProperty(DataLoadConfig.OUTPUT_TABLE);
             OutputUtils.addTable(Utils.parseTableURL(odps, outputTable), job);
         } else if (dataSinkType.equalsIgnoreCase("HDFS")) {
-            throw new IOException("HDFS as a data sink is not supported in ODPS");
+            throw new InvalidArgumentException("HDFS as a data sink is not supported in ODPS");
         } else {
-            throw new IOException("Unsupported data sink: " + dataSinkType);
+            throw new InvalidArgumentException("Unsupported data sink: " + dataSinkType);
         }
 
         String schemaJson = GraphSchemaMapper.parseFromSchema(schema).toJsonString();
@@ -183,7 +183,7 @@ public static void main(String[] args) throws Exception {
         try {
             JobClient.runJob(job);
         } catch (Exception e) {
-            throw new IOException(e);
+            throw new InvalidArgumentException(e);
         }
 
         String _tmp = properties.getProperty(DataLoadConfig.LOAD_AFTER_BUILD, "true");
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/SstOutputFormat.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/SstOutputFormat.java
index 34b0baccd02c..2507b2c31d14 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/SstOutputFormat.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/SstOutputFormat.java
@@ -15,6 +15,8 @@
  */
 package com.alibaba.graphscope.groot.dataload.databuild;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
@@ -64,7 +66,7 @@ public void write(BytesWritable key, BytesWritable value) throws IOException {
                 ByteBuffer buffer = ByteBuffer.wrap(key.copyBytes());
                 long tableId = buffer.getLong(0) >> 1;
                 long hashId = buffer.getLong(8);
-                throw new IOException(
+                throw new InvalidArgumentException(
                         "Write SST Error! TableId: [" + tableId + "], hashId: [" + hashId + "]", e);
             }
         }
@@ -74,7 +76,7 @@ public void close(TaskAttemptContext context) throws IOException {
             try {
                 sstFileWriter.finish();
             } catch (RocksDBException e) {
-                throw new IOException(e);
+                throw new InvalidArgumentException(e);
             }
             fs.copyFromLocalFile(true, new Path(fileName), path);
         }
@@ -91,7 +93,7 @@ public RecordWriter<BytesWritable, BytesWritable> getRecordWriter(TaskAttemptCon
         try {
             return new SstRecordWriter(fs, file);
         } catch (RocksDBException e) {
-            throw new IOException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 }
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/Utils.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/Utils.java
index dc85b2b2ddf8..75715a9f7517 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/Utils.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/databuild/Utils.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.dataload.databuild;
 
-import com.alibaba.graphscope.groot.common.exception.PropertyDefNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+import com.alibaba.graphscope.groot.common.exception.NotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.*;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyValue;
 import com.alibaba.graphscope.groot.dataload.unified.*;
@@ -201,12 +202,12 @@ public static Map<Integer, PropertyValue> buildProperties(
                     String msg = "Label [" + label + "]: ";
                     if (prop == null) {
                         msg += "propertyId [" + propertyId + "] not found";
-                        throw new PropertyDefNotFoundException(msg);
+                        throw new NotFoundException(msg);
                     }
                     if (colIdx >= items.length) {
                         msg += "Invalid mapping [" + colIdx + "]->[" + propertyId + "]";
                         msg += "Data: " + Arrays.toString(items);
-                        throw new IllegalArgumentException(msg);
+                        throw new InvalidArgumentException(msg);
                     }
                     PropertyValue propertyValue = null;
                     if (items[colIdx] != null) {
@@ -266,7 +267,7 @@ public static String convertDateForLDBC(String input) {
         try {
             return DST_FMT.format(SRC_FMT.parse(input));
         } catch (ParseException e) {
-            throw new RuntimeException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/FSFactory.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/FSFactory.java
index fb360e0e7e1c..5f008e09fd3c 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/FSFactory.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/FSFactory.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.dataload.util;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.aliyun.odps.mapred.conf.JobConf;
 
 import java.io.IOException;
@@ -15,9 +16,9 @@ public static AbstractFileSystem Create(JobConf conf) throws IOException {
         } else if (dataSinkType.equalsIgnoreCase("OSS")) {
             return new OSSFS(conf);
         } else if (dataSinkType.equalsIgnoreCase("HDFS")) {
-            throw new IOException("HDFS as a data sink is not supported in ODPS");
+            throw new InvalidArgumentException("HDFS as a data sink is not supported in ODPS");
         } else {
-            throw new IOException("Unsupported data sink: " + dataSinkType);
+            throw new InvalidArgumentException("Unsupported data sink: " + dataSinkType);
         }
     }
 }
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/HttpClient.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/HttpClient.java
index d984f4a392ec..b7d85486b481 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/HttpClient.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/HttpClient.java
@@ -1,5 +1,7 @@
 package com.alibaba.graphscope.groot.dataload.util;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+
 import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpStatus;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -81,14 +83,14 @@ public static String doGet(String url, Map<String, String> param) throws Excepti
             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                 resultMsg = EntityUtils.toString(response.getEntity(), "UTF-8");
             } else {
-                throw new Exception(
-                        "调用http-get方法返回失败code="
+                throw new InvalidArgumentException(
+                        "HTTP GET failed. code="
                                 + response.getStatusLine().getStatusCode()
-                                + ",msg="
+                                + ", msg="
                                 + response.getStatusLine().getReasonPhrase());
             }
         } catch (Exception e) {
-            throw new Exception("调用http-get方法异常", e);
+            throw new InvalidArgumentException("HTTP GET failed", e);
         } finally {
             try {
                 if (response != null) {
@@ -96,7 +98,7 @@ public static String doGet(String url, Map<String, String> param) throws Excepti
                 }
                 httpClient.close();
             } catch (IOException e) {
-                throw new Exception("httpClient close异常", e);
+                throw new InvalidArgumentException("httpClient close failed", e);
             }
         }
         return resultMsg;
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/OSSFS.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/OSSFS.java
index fbfc378662cf..89bcc3ebbda9 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/OSSFS.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/OSSFS.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.dataload.util;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.dataload.unified.UniConfig;
 import com.aliyun.odps.mapred.TaskContext;
 import com.aliyun.odps.mapred.conf.JobConf;
@@ -40,7 +41,7 @@ private void initClient() throws IOException {
             this.ossClient =
                     new OSSClientBuilder().build(endpoint, ossAccessID, ossAccessKey, conf);
         } catch (OSSException | ClientException oe) {
-            throw new IOException(oe);
+            throw new InvalidArgumentException(oe);
         }
     }
 
@@ -77,7 +78,7 @@ public OSSFS(UniConfig properties) throws IOException {
     }
 
     @Override
-    public void open(TaskContext context, String mode) throws IOException {}
+    public void open(TaskContext context, String mode) {}
 
     public String getQualifiedPath() {
         return "oss://";
@@ -123,7 +124,7 @@ public void putObject(String prefix, String fileName) throws IOException {
         }
     }
 
-    public void uploadFileWithCheckPoint(String srcFile, String dstFile) throws IOException {
+    public void uploadFileWithCheckPoint(String srcFile, String dstFile) {
         String key = Paths.get(object, dstFile).toString();
         UploadFileRequest uploadFileRequest = new UploadFileRequest(bucket, key);
         uploadFileRequest.setUploadFile(srcFile);
@@ -133,10 +134,10 @@ public void uploadFileWithCheckPoint(String srcFile, String dstFile) throws IOEx
             ossClient.uploadFile(uploadFileRequest);
         } catch (OSSException oe) {
             logger.error("Error message: {}", oe.getMessage());
-            throw new IOException(oe);
+            throw new InvalidArgumentException(oe);
         } catch (Throwable ce) {
             logger.error("Error Message:" + ce.getMessage());
-            throw new IOException(ce);
+            throw new InvalidArgumentException(ce);
         }
     }
 
@@ -169,7 +170,7 @@ public String readToString(String fileName) throws IOException {
             ossObject.close();
         } catch (OSSException | ClientException oe) {
             logger.error("Error Message:" + oe.getMessage());
-            throw new IOException(oe);
+            throw new InvalidArgumentException(oe);
         }
         return data.toString();
     }
diff --git a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/VolumeFS.java b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/VolumeFS.java
index 238f6a92812f..431edd62f990 100644
--- a/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/VolumeFS.java
+++ b/interactive_engine/data-load-tool/src/main/java/com/alibaba/graphscope/groot/dataload/util/VolumeFS.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.dataload.util;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.dataload.unified.UniConfig;
 import com.aliyun.odps.Odps;
 import com.aliyun.odps.OdpsException;
@@ -80,7 +81,7 @@ public Map<String, String> setConfig(Odps odps) throws IOException {
         AliyunAccount aliyunAccount =
                 account instanceof AliyunAccount ? ((AliyunAccount) account) : null;
         if (aliyunAccount == null) {
-            throw new IOException("Not an AliyunAccount");
+            throw new InvalidArgumentException("Not an AliyunAccount");
         }
         HashMap<String, String> config = new HashMap<>();
         config.put(DataLoadConfig.ODPS_ACCESS_ID, aliyunAccount.getAccessId());
@@ -175,7 +176,7 @@ public void createVolumeIfNotExists(Odps odps) throws IOException {
                             + e.getErrorCode()
                             + "]: "
                             + e.getMessage());
-            throw new IOException(e.getMessage());
+            throw new InvalidArgumentException(e.getMessage());
         }
     }
 
diff --git a/interactive_engine/data-load-tool/src/main/scala/com/alibaba/graphscope/groot/dataload/LoadToolSpark.scala b/interactive_engine/data-load-tool/src/main/scala/com/alibaba/graphscope/groot/dataload/LoadToolSpark.scala
deleted file mode 100644
index cbcdfa4aa0f4..000000000000
--- a/interactive_engine/data-load-tool/src/main/scala/com/alibaba/graphscope/groot/dataload/LoadToolSpark.scala
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * Copyright 2020 Alibaba Group Holding Limited.
- *
- * <p>Licensed 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
- *
- * <p>http://www.apache.org/licenses/LICENSE-2.0
- *
- * <p>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 com.alibaba.graphscope.groot.dataload
-
-import org.apache.spark.sql.SparkSession
-
-object LoadToolSpark {
-
-  def main(args: Array[String]) {
-
-    val spark = SparkSession
-      .builder()
-      .appName("LoadToolSpark")
-      .getOrCreate()
-
-    try {
-      val command = args(0)
-      val configPath = args(1)
-      if ("ingest".equalsIgnoreCase(command)) {
-        LoadTool.ingest(configPath)
-      } else if ("commit".equalsIgnoreCase(command)) {
-        LoadTool.commit(configPath)
-      } else if ("ingestAndCommit".equalsIgnoreCase(command)) {
-        LoadTool.ingest(configPath)
-        LoadTool.commit(configPath)
-      } else {
-        throw new Exception("supported COMMAND: ingest / commit / ingestAndCommit");
-      }
-    } catch {
-      case e: Throwable => throw e
-    }
-    spark.close()
-  }
-}
diff --git a/interactive_engine/executor/assembly/groot/src/store/jna_response.rs b/interactive_engine/executor/assembly/groot/src/store/jna_response.rs
index 405cfda77230..952d362ee9a0 100644
--- a/interactive_engine/executor/assembly/groot/src/store/jna_response.rs
+++ b/interactive_engine/executor/assembly/groot/src/store/jna_response.rs
@@ -3,7 +3,7 @@ use std::fmt;
 use std::fmt::Formatter;
 use std::os::raw::{c_char, c_void};
 
-use groot_store::db::api::{GraphError, GraphErrorCode, GraphResult};
+use groot_store::db::api::{ErrorCode, GraphError, GraphResult};
 
 #[repr(C)]
 #[allow(non_snake_case)]
@@ -52,7 +52,7 @@ impl JnaResponse {
     pub fn data(&mut self, data: Vec<u8>) -> GraphResult<()> {
         if data.len() != data.capacity() {
             let msg = format!("data len {} must eq capacity {}", data.len(), data.capacity());
-            return Err(GraphError::new(GraphErrorCode::InvalidData, msg));
+            return Err(GraphError::new(ErrorCode::INVALID_DATA, msg));
         }
         self.data = data.as_ptr() as *const c_void;
         self.len = data.len() as i32;
diff --git a/interactive_engine/executor/store/groot/build.rs b/interactive_engine/executor/store/groot/build.rs
index 1c92ad4c1efe..fe123a94ae35 100644
--- a/interactive_engine/executor/store/groot/build.rs
+++ b/interactive_engine/executor/store/groot/build.rs
@@ -7,6 +7,7 @@ fn main() {
             proto_root.to_owned() + "/groot/sdk/model.proto",
             proto_root.to_owned() + "/groot/sdk/schema.proto",
             proto_root.to_owned() + "/schema_common.proto",
+            proto_root.to_owned() + "/error/insight.proto",
         ],
         &[proto_root],
         "./src/db/proto",
diff --git a/interactive_engine/executor/store/groot/src/db/api/error.rs b/interactive_engine/executor/store/groot/src/db/api/error.rs
index 5c79dc3e683d..bd1b030dee9d 100644
--- a/interactive_engine/executor/store/groot/src/db/api/error.rs
+++ b/interactive_engine/executor/store/groot/src/db/api/error.rs
@@ -1,118 +1,43 @@
 use std::fmt::Debug;
 
+use protobuf::ProtobufEnum;
+
+pub use crate::db::proto::insight::Code as ErrorCode;
+
 #[derive(Clone)]
-pub struct ErrorWithBackTrace {
-    err_code: GraphErrorCode,
+pub struct GraphError {
+    err_code: ErrorCode,
+    ec: String,
     msg: String,
     backtrace: Vec<(String, String)>,
 }
 
-impl ErrorWithBackTrace {
-    pub fn new(err_code: GraphErrorCode, msg: String) -> Self {
-        ErrorWithBackTrace { err_code, msg, backtrace: Vec::new() }
+impl GraphError {
+    pub fn new(err_code: ErrorCode, msg: String) -> Self {
+        let ec = format!("06-{:04}", err_code.value());
+        GraphError { err_code, ec, msg, backtrace: Vec::new() }
     }
 
     pub fn add_backtrace(&mut self, function: String, code_info: String) {
         self.backtrace.push((function, code_info));
     }
-
-    pub fn get_error_code(&self) -> GraphErrorCode {
+    pub fn get_error_code(&self) -> ErrorCode {
         self.err_code
     }
 }
 
-#[derive(Clone)]
-pub enum GraphError {
-    WithBackTrace(ErrorWithBackTrace),
-    Internal(String),
-    Rocksdb(String),
-    InvalidArgument(String),
-    TooManyVersions(usize),
-}
-
-impl GraphError {
-    pub fn new(err_code: GraphErrorCode, msg: String) -> Self {
-        let inner = ErrorWithBackTrace { err_code, msg, backtrace: Vec::new() };
-        GraphError::WithBackTrace(inner)
-    }
-
-    pub fn add_backtrace(&mut self, function: String, code_info: String) {
-        match self {
-            GraphError::WithBackTrace(inner) => {
-                inner.add_backtrace(function, code_info);
-            }
-            _ => {
-                unimplemented!()
-            }
-        }
-    }
-
-    pub fn get_error_code(&self) -> GraphErrorCode {
-        match self {
-            GraphError::WithBackTrace(inner) => inner.get_error_code(),
-            _ => {
-                unimplemented!()
-            }
-        }
-    }
-}
-
 impl Debug for GraphError {
-    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
-        match self {
-            GraphError::WithBackTrace(inner) => {
-                writeln!(f, "")?;
-                writeln!(f, "error code: {:?}, msg: {}", inner.err_code, inner.msg)?;
-                for bt in inner.backtrace.iter().rev() {
-                    writeln!(f, "\t{}", bt.0)?;
-                    writeln!(f, "\t\tat {}", bt.1)?;
-                }
-                write!(f, "")
-            }
-            GraphError::Internal(s) | GraphError::Rocksdb(s) | GraphError::InvalidArgument(s) => {
-                write!(f, "{}", s)
-            }
-            GraphError::TooManyVersions(limit) => write!(f, "version count exceed limit {}", limit),
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        writeln!(f, "")?;
+        writeln!(f, "error code: {:?}, ec: {}, msg: {}", self.err_code, self.ec, self.msg)?;
+        for bt in self.backtrace.iter().rev() {
+            writeln!(f, "\t{}", bt.0)?;
+            writeln!(f, "\t\tat {}", bt.1)?;
         }
+        write!(f, "")
     }
 }
 
-#[allow(dead_code)]
-#[derive(Debug, Copy, Clone)]
-pub enum GraphErrorCode {
-    // try to get a property in ValueType1, but the it's real type is ValueType2 and it's not ValueType1 and
-    // compatible to ValueType1
-    ValueTypeMismatch,
-    // transform bytes to str failed because it's not in utf-8 format
-    Utf8Error,
-    // something error with binary data in storage
-    InvalidData,
-    // get lock failed
-    LockFailed,
-    // too many data of old versions in graph store, maybe something error with garbage collection
-    TooManyVersions,
-    // some fatal bug in graph store
-    GraphStoreBug,
-    // user's operation is invalid, like: create a type that already exists
-    InvalidOperation,
-    // when try to insert data, the type exists in storage but isn't visible at that moment
-    DataNotExists,
-    // vertex type or edge type is not found
-    TypeNotFound,
-    // vertex type or edge type already exists
-    TypeAlreadyExists,
-    // error in external storage like rocksdb
-    ExternalStorageError,
-    // decode property from bytes failed
-    DecodeError,
-    // vertex type not found, edge not found
-    MetaNotFound,
-    // operations or features is not supported
-    NotSupported,
-    // engine error
-    EngineError,
-}
-
 macro_rules! func_signature {
     ($func:tt, $($x:tt),*) => {
         {
diff --git a/interactive_engine/executor/store/groot/src/db/api/property.rs b/interactive_engine/executor/store/groot/src/db/api/property.rs
index d28cf936cf3a..b1622bb9d6d2 100644
--- a/interactive_engine/executor/store/groot/src/db/api/property.rs
+++ b/interactive_engine/executor/store/groot/src/db/api/property.rs
@@ -91,7 +91,7 @@ impl ValueType {
             x if x == ValueType::StringList as i32 => Ok(ValueType::StringList),
             _ => {
                 let msg = format!("invalid input");
-                let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, from_i32, x);
+                let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, from_i32, x);
                 Err(err)
             }
         }
@@ -102,7 +102,7 @@ impl ValueType {
         match DataTypePb::from_i32(v) {
             None => {
                 let msg = format!("invalid input");
-                let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, to_proto, v);
+                let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, to_proto, v);
                 Err(err)
             }
             Some(pb) => Ok(pb),
@@ -199,7 +199,7 @@ impl<'a> ValueRef<'a> {
         let res = self.check_type_match(ValueType::String);
         res_unwrap!(res, get_str)?;
         ::std::str::from_utf8(self.data)
-            .map_err(|e| gen_graph_err!(GraphErrorCode::Utf8Error, e.to_string(), get_str))
+            .map_err(|e| gen_graph_err!(ErrorCode::INVALID_DATA, e.to_string(), get_str))
     }
 
     pub fn get_bytes(&self) -> GraphResult<&[u8]> {
@@ -285,7 +285,7 @@ impl<'a> ValueRef<'a> {
     pub fn check_type_match(&self, value_type: ValueType) -> GraphResult<()> {
         if self.r#type != value_type {
             let msg = format!("cannot transform {:?} to {:?}", self.r#type, value_type);
-            let err = gen_graph_err!(GraphErrorCode::ValueTypeMismatch, msg, check_type_match, value_type);
+            let err = gen_graph_err!(ErrorCode::VALUE_TYPE_MISMATCH, msg, check_type_match, value_type);
             return Err(err);
         }
         Ok(())
@@ -302,7 +302,7 @@ impl<'a> ValueRef<'a> {
             return Ok(reader);
         }
         let msg = format!("invalid {:?} bytes, data len is {}", value_type, self.data.len());
-        let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, check_numeric_array);
+        let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, check_numeric_array);
         Err(err)
     }
 
@@ -318,7 +318,7 @@ impl<'a> ValueRef<'a> {
             return Ok(reader);
         }
         let msg = format!("invalid str array bytes");
-        let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, weak_check_str_list);
+        let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, weak_check_str_list);
         Err(err)
     }
 }
diff --git a/interactive_engine/executor/store/groot/src/db/api/schema.rs b/interactive_engine/executor/store/groot/src/db/api/schema.rs
index 42088d5a3948..7976e428e1de 100644
--- a/interactive_engine/executor/store/groot/src/db/api/schema.rs
+++ b/interactive_engine/executor/store/groot/src/db/api/schema.rs
@@ -51,7 +51,7 @@ impl GraphDef {
     pub fn add_type(&mut self, label: LabelId, type_def: TypeDef) -> GraphResult<()> {
         if self.label_to_types.contains_key(&label) {
             let msg = format!("labelId {}", label);
-            return Err(GraphError::new(GraphErrorCode::TypeAlreadyExists, msg));
+            return Err(GraphError::new(ErrorCode::ALREADY_EXISTS, msg));
         }
         for property in type_def.get_prop_defs() {
             if property.id > self.property_idx {
@@ -67,7 +67,7 @@ impl GraphDef {
     pub fn update_type(&mut self, label: LabelId, type_def: TypeDef) -> GraphResult<()> {
         if !self.label_to_types.contains_key(&label) {
             let msg = format!("labelId {}", label);
-            return Err(GraphError::new(GraphErrorCode::TypeNotFound, msg));
+            return Err(GraphError::new(ErrorCode::TYPE_NOT_FOUND, msg));
         }
         for property in type_def.get_prop_defs() {
             if property.id > self.property_idx {
@@ -250,7 +250,7 @@ impl TypeDef {
             Ok(b) => Ok(b),
             Err(e) => {
                 let msg = format!("{:?}", e);
-                Err(gen_graph_err!(GraphErrorCode::InvalidData, msg, to_bytes))
+                Err(gen_graph_err!(ErrorCode::INVALID_DATA, msg, to_bytes))
             }
         }
     }
diff --git a/interactive_engine/executor/store/groot/src/db/common/bytes/transform.rs b/interactive_engine/executor/store/groot/src/db/common/bytes/transform.rs
index 276dd61a7dea..03a0f6b87ba7 100644
--- a/interactive_engine/executor/store/groot/src/db/common/bytes/transform.rs
+++ b/interactive_engine/executor/store/groot/src/db/common/bytes/transform.rs
@@ -27,7 +27,7 @@ pub fn bytes_to_i64(buf: &[u8]) -> GraphResult<i64> {
         Ok(reader.read_i64(0))
     } else {
         let msg = format!("bytes with length {} cannot transform to i64", buf.len());
-        let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, bytes_to_i64);
+        let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, bytes_to_i64);
         Err(err)
     }
 }
@@ -42,6 +42,6 @@ pub fn i64_to_arr(x: i64) -> [u8; 8] {
 pub fn bytes_to_str(buf: &[u8]) -> GraphResult<&str> {
     std::str::from_utf8(buf).map_err(|e| {
         let msg = format!("{:?}", e);
-        gen_graph_err!(GraphErrorCode::InvalidData, msg, bytes_to_str)
+        gen_graph_err!(ErrorCode::INVALID_DATA, msg, bytes_to_str)
     })
 }
diff --git a/interactive_engine/executor/store/groot/src/db/common/bytes/util.rs b/interactive_engine/executor/store/groot/src/db/common/bytes/util.rs
index 78c571ee979f..3ee6aef3afb6 100644
--- a/interactive_engine/executor/store/groot/src/db/common/bytes/util.rs
+++ b/interactive_engine/executor/store/groot/src/db/common/bytes/util.rs
@@ -3,8 +3,7 @@ use std::marker::PhantomData;
 
 use protobuf::Message;
 
-use crate::db::api::GraphErrorCode::InvalidData;
-use crate::db::api::{GraphError, GraphResult};
+use crate::db::api::{ErrorCode, GraphError, GraphResult};
 
 /// define the size that a length field takes in encoding an array
 pub const LEN_SIZE: usize = ::std::mem::size_of::<u32>();
@@ -114,7 +113,7 @@ impl UnsafeBytesWriter {
 }
 
 pub fn parse_pb<M: Message>(buf: &[u8]) -> GraphResult<M> {
-    Message::parse_from_bytes(buf).map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))
+    Message::parse_from_bytes(buf).map_err(|e| GraphError::new(ErrorCode::INVALID_DATA, format!("{:?}", e)))
 }
 
 #[cfg(test)]
diff --git a/interactive_engine/executor/store/groot/src/db/common/concurrency/volatile.rs b/interactive_engine/executor/store/groot/src/db/common/concurrency/volatile.rs
index fc89cf430edc..071586e1edab 100644
--- a/interactive_engine/executor/store/groot/src/db/common/concurrency/volatile.rs
+++ b/interactive_engine/executor/store/groot/src/db/common/concurrency/volatile.rs
@@ -1,5 +1,3 @@
-use std::cell::UnsafeCell;
-
 #[derive(Clone)]
 pub struct Volatile<T> {
     data: T,
@@ -33,6 +31,6 @@ impl<T: Copy + Clone> Volatile<T> {
     #[rustversion::since(1.76.0)]
     pub fn set(&self, data: T) {
         let ptr = &self.data as *const T;
-        unsafe { std::ptr::write_volatile((&*(ptr as *mut UnsafeCell<T>)).get(), data) }
+        unsafe { std::ptr::write_volatile((&*(ptr as *mut std::cell::UnsafeCell<T>)).get(), data) }
     }
 }
diff --git a/interactive_engine/executor/store/groot/src/db/common/str.rs b/interactive_engine/executor/store/groot/src/db/common/str.rs
index 4e958bf20dd3..d5b036139e8d 100644
--- a/interactive_engine/executor/store/groot/src/db/common/str.rs
+++ b/interactive_engine/executor/store/groot/src/db/common/str.rs
@@ -4,20 +4,20 @@ use crate::db::api::*;
 pub fn str_to_i64(s: &str) -> GraphResult<i64> {
     s.parse().map_err(|e| {
         let msg = format!("{:?}", e);
-        gen_graph_err!(GraphErrorCode::InvalidData, msg, str_to_i64, s)
+        gen_graph_err!(ErrorCode::INVALID_DATA, msg, str_to_i64, s)
     })
 }
 
 pub fn str_to_i32(s: &str) -> GraphResult<i32> {
     s.parse().map_err(|e| {
         let msg = format!("{:?}", e);
-        gen_graph_err!(GraphErrorCode::InvalidData, msg, str_to_i64, s)
+        gen_graph_err!(ErrorCode::INVALID_DATA, msg, str_to_i64, s)
     })
 }
 
 pub fn parse_str<T: std::str::FromStr>(s: &str) -> GraphResult<T> {
     s.parse().map_err(|_| {
         let msg = format!("parse str failed");
-        gen_graph_err!(GraphErrorCode::InvalidData, msg, parse_str, s)
+        gen_graph_err!(ErrorCode::INVALID_DATA, msg, parse_str, s)
     })
 }
diff --git a/interactive_engine/executor/store/groot/src/db/graph/bin.rs b/interactive_engine/executor/store/groot/src/db/graph/bin.rs
index bca2941fcc33..d7f66da9557d 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/bin.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/bin.rs
@@ -17,7 +17,7 @@ pub fn vertex_key(table_id: TableId, id: VertexId, ts: SnapshotId) -> [u8; 24] {
 pub fn parse_vertex_key(key: &[u8]) -> GraphResult<(VertexId, SnapshotId)> {
     if key.len() != 24 {
         let msg = format!("invalid key, key len is {}", key.len());
-        let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, parse_vertex_key);
+        let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, parse_vertex_key);
         error!("parse_vertex_key failed. error: {:?}", err);
         return Err(err);
     }
diff --git a/interactive_engine/executor/store/groot/src/db/graph/codec.rs b/interactive_engine/executor/store/groot/src/db/graph/codec.rs
index b8ab06d6a343..8526a99e9c4e 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/codec.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/codec.rs
@@ -402,7 +402,7 @@ impl Encoder {
         //     if let Some(data) = props.get(info.prop_id) {
         //         if !check_fixed_prop_len(info.r#type, data) {
         //             let msg = format!("invalid {:?} data", info.r#type);
-        //             let err = gen_graph_err!(GraphErrorCode::InvalidData, msg);
+        //             let err = gen_graph_err!(GraphErrorCode::INVALID_DATA, msg);
         //             return Err(err);
         //         }
         //     }
@@ -498,7 +498,7 @@ fn check_var_len_prop(r#type: ValueType, data: &[u8]) -> GraphResult<()> {
                 return Ok(());
             }
             let msg = format!("string is not utf-8");
-            let err = gen_graph_err!(GraphErrorCode::InvalidData, msg);
+            let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg);
             return Err(err);
         }
         ValueType::Bytes => {
@@ -523,7 +523,7 @@ fn check_var_len_prop(r#type: ValueType, data: &[u8]) -> GraphResult<()> {
         _ => unreachable!(),
     }
     let msg = format!("invalid {:?} data, length is not right", r#type);
-    let err = gen_graph_err!(GraphErrorCode::InvalidData, msg);
+    let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg);
     Err(err)
 }
 
@@ -548,13 +548,13 @@ impl CodecManager {
         let mut max_version = res_unwrap!(self.lock.lock(), add_codec, si, codec)?;
         if self.versions.get_latest_version() >= si {
             let msg = format!("si#{} is too small, cannot add", si);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add_codec, si, codec);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add_codec, si, codec);
             return Err(err);
         }
         let version = codec.get_version();
         if version <= *max_version {
             let msg = format!("current max codec version is {}, you cannot add a older one", *max_version);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add_codec, si, codec);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add_codec, si, codec);
             return Err(err);
         }
         let codec = Arc::new(codec);
@@ -563,7 +563,7 @@ impl CodecManager {
 
         let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si)
         })?;
         let mut map_clone = map_ref.clone();
         map_clone.insert(version, codec);
@@ -582,12 +582,12 @@ impl CodecManager {
             let map = self.get_map(&guard);
             let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
                 let msg = "get map reference return `None`".to_string();
-                gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si)
+                gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si)
             })?;
             return get_codec(map_ref, version).map(|codec| Encoder::new(codec));
         }
         let msg = format!("codec not found at si#{}", si);
-        let err = gen_graph_err!(GraphErrorCode::MetaNotFound, msg, get_encoder, si);
+        let err = gen_graph_err!(ErrorCode::NOT_FOUND, msg, get_encoder, si);
         Err(err)
     }
 
@@ -598,14 +598,14 @@ impl CodecManager {
             let map = self.get_map(&guard);
             let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
                 let msg = "get map reference return `None`".to_string();
-                gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, version)
+                gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, version)
             })?;
             let src = res_unwrap!(get_codec(map_ref, version), get_decoder, si, version)?;
             let target = res_unwrap!(get_codec(map_ref, target_version), get_decoder, si, version)?;
             return Ok(Decoder::new(target, src));
         }
         let msg = format!("codec not found at si#{}", si);
-        let err = gen_graph_err!(GraphErrorCode::MetaNotFound, msg, get_decoder, si, version);
+        let err = gen_graph_err!(ErrorCode::NOT_FOUND, msg, get_decoder, si, version);
         Err(err)
     }
 
@@ -616,7 +616,7 @@ impl CodecManager {
         let map = self.get_map(&guard);
         let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, version)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, version)
         })?;
         let mut map_clone = map_ref.clone();
         if map_clone.remove(&version).is_some() {
@@ -639,7 +639,7 @@ impl CodecManager {
 fn get_codec(map: &CodecMap, version: CodecVersion) -> GraphResult<Arc<Codec>> {
     map.get(&version).cloned().ok_or_else(|| {
         let msg = format!("codec of version#{} not found", version);
-        gen_graph_err!(GraphErrorCode::MetaNotFound, msg, get_encoder, version)
+        gen_graph_err!(ErrorCode::NOT_FOUND, msg, get_encoder, version)
     })
 }
 
diff --git a/interactive_engine/executor/store/groot/src/db/graph/meta.rs b/interactive_engine/executor/store/groot/src/db/graph/meta.rs
index 8efd4e77b085..6f184d123b24 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/meta.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/meta.rs
@@ -5,7 +5,7 @@ use protobuf::Message;
 
 use super::table_manager::*;
 use super::types::*;
-use crate::db::api::GraphErrorCode::InvalidData;
+use crate::db::api::ErrorCode::INVALID_DATA;
 use crate::db::api::*;
 use crate::db::common::bytes::transform;
 use crate::db::common::bytes::util::parse_pb;
@@ -128,7 +128,7 @@ impl Meta {
                             "current label idx {}, create label id {}",
                             current_label_idx, label_id
                         );
-                        return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                        return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
                     }
                     graph_def.add_type(label_id, x.type_def.clone())?;
                     graph_def.put_vertex_table_id(label_id, x.table_id);
@@ -155,7 +155,7 @@ impl Meta {
                             "current label idx {}, create label id {}",
                             current_label_idx, label_id
                         );
-                        return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                        return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
                     }
                     graph_def.add_type(label_id, x.type_def.clone())?;
                     graph_def.set_label_idx(label_id);
@@ -223,7 +223,7 @@ impl Meta {
                         label_id, x.table_id, x.si, x.type_def
                     );
                     let mut graph_def = self.graph_def_lock.lock()?;
-                    graph_def.update_type(label_id, x.type_def.clone());
+                    let _ = graph_def.update_type(label_id, x.type_def.clone());
                     graph_def.increase_version();
                     vertex_manager_builder.update_type(x.si, x.label_id, &x.type_def)?;
                 }
@@ -231,7 +231,7 @@ impl Meta {
                     let label_id = x.type_def.get_label_id();
                     info!("AddEdgeProperty label {:?}, si {:?}, typedef {:?}", label_id, x.si, x.type_def);
                     let mut graph_def = self.graph_def_lock.lock()?;
-                    graph_def.update_type(label_id, x.type_def.clone());
+                    let _ = graph_def.update_type(label_id, x.type_def.clone());
                     graph_def.increase_version();
                     edge_manager_builder.update_edge_type(x.si, x.label_id, &x.type_def)?;
                 }
@@ -245,7 +245,7 @@ impl Meta {
         let current_version = graph_def.get_version();
         if current_version >= schema_version {
             let msg = format!("current schema version {} >= {}", current_version, schema_version);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_vertex_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_vertex_type);
             return Err(err);
         }
         Ok(())
@@ -302,7 +302,7 @@ impl Meta {
             let current_label_idx = graph_def.get_label_idx();
             if current_label_idx >= label_id {
                 let msg = format!("current label idx {}, create label id {}", current_label_idx, label_id);
-                return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
             }
             graph_def.add_type(label_id, type_def.clone())?;
             graph_def.put_vertex_table_id(label_id, table_id);
@@ -330,7 +330,7 @@ impl Meta {
                         "Property with name '{}' already exists in type for label_id {}",
                         new_property_name, label_id
                     );
-                    return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                    return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
                 }
                 cloned.add_property(new_property.clone());
             }
@@ -338,14 +338,13 @@ impl Meta {
             let item = AddVertexPropertyItem::new(si, schema_version, label_id, table_id, cloned.clone());
             self.write_item(item)?;
             {
-                let current_label_idx = graph_def.get_label_idx();
                 graph_def.update_type(label_id, cloned.clone())?;
                 graph_def.increase_version();
             }
             Ok((Table::new(si, table_id), cloned))
         } else {
             let msg = format!("current label id {} not exist.", label_id);
-            return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+            return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
         }
     }
 
@@ -374,7 +373,7 @@ impl Meta {
             let current_label_idx = graph_def.get_label_idx();
             if current_label_idx >= label_id {
                 let msg = format!("current label idx {}, create label id {}", current_label_idx, label_id);
-                return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
             }
             graph_def.add_type(type_def.get_label_id(), type_def.clone())?;
             graph_def.set_label_idx(label_id);
@@ -399,7 +398,7 @@ impl Meta {
                         "Property with name '{}' already exists in type for label_id {}",
                         new_property_name, label_id
                     );
-                    return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+                    return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
                 }
                 cloned.add_property(new_property.clone());
             }
@@ -407,14 +406,13 @@ impl Meta {
             let item = AddEdgePropertyItem::new(si, schema_version, label_id, cloned.clone());
             self.write_item(item)?;
             {
-                let current_label_idx = graph_def.get_label_idx();
                 graph_def.update_type(label_id, cloned.clone())?;
                 graph_def.increase_version();
             }
             Ok(cloned)
         } else {
             let msg = format!("current label id {} not exist.", label_id);
-            return Err(GraphError::new(GraphErrorCode::InvalidOperation, msg));
+            return Err(GraphError::new(ErrorCode::INVALID_OPERATION, msg));
         }
     }
 
@@ -470,7 +468,7 @@ impl Meta {
                     let table_id = id.to_be() + 1;
                     if table_id >= 0 {
                         let msg = format!("cannot assign any more table id");
-                        let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, get_next_table_id);
+                        let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, get_next_table_id);
                         return Err(err);
                     }
                     Ok(table_id)
@@ -542,7 +540,7 @@ impl MetaItem {
 fn common_parse_key<'a>(k: &'a [u8], prefix: &str, size: usize) -> GraphResult<Vec<&'a str>> {
     if transform::bytes_to_i64(&k[0..8])?.to_be() != META_TABLE_ID {
         let msg = format!("invalid meta key");
-        let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, common_parse_key, k, prefix, size);
+        let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, common_parse_key, k, prefix, size);
         return Err(err);
     }
     let key = res_unwrap!(transform::bytes_to_str(&k[8..]), common_parse_key, k, prefix, size)?;
@@ -551,7 +549,7 @@ fn common_parse_key<'a>(k: &'a [u8], prefix: &str, size: usize) -> GraphResult<V
         return Ok(items);
     }
     let msg = format!("invalid key {}", key);
-    let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, common_parse_key, k, prefix, size);
+    let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, common_parse_key, k, prefix, size);
     Err(err)
 }
 
@@ -600,7 +598,7 @@ impl ItemCommon for PrepareDataLoadItem {
         let target_pb = self.target.to_proto();
         let bytes = target_pb
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
@@ -641,7 +639,7 @@ impl ItemCommon for CommitDataLoadItem {
         let target_pb = self.target.to_proto();
         let bytes = target_pb
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
@@ -691,7 +689,7 @@ impl ItemCommon for CreateVertexTypeItem {
         let typedef_pb = self.type_def.to_proto()?;
         let bytes = typedef_pb
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
@@ -799,7 +797,7 @@ impl ItemCommon for AddEdgeKindItem {
             .edge_kind
             .to_proto()
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
@@ -871,7 +869,7 @@ impl ItemCommon for RemoveEdgeKindItem {
             .edge_kind
             .to_proto()
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
@@ -921,7 +919,7 @@ impl ItemCommon for AddVertexPropertyItem {
         let typedef_pb = self.type_def.to_proto()?;
         let bytes = typedef_pb
             .write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))?;
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))?;
         Ok((meta_key(&key), bytes))
     }
 }
diff --git a/interactive_engine/executor/store/groot/src/db/graph/store.rs b/interactive_engine/executor/store/groot/src/db/graph/store.rs
index b04962305259..e34e9bed3a3e 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/store.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/store.rs
@@ -19,7 +19,7 @@ use crate::api::ElemFilter;
 use crate::api::PropId;
 use crate::db::api::multi_version_graph::{GraphBackup, MultiVersionGraph};
 use crate::db::api::types::RocksEdge;
-use crate::db::api::GraphErrorCode::{InvalidData, TypeNotFound};
+use crate::db::api::ErrorCode::{INVALID_DATA, TYPE_NOT_FOUND};
 use crate::db::api::*;
 use crate::db::common::bytes::transform;
 use crate::db::graph::entity::{RocksEdgeImpl, RocksVertexImpl};
@@ -146,7 +146,7 @@ impl MultiVersionGraph for GraphStore {
                         scan.into_iter()
                     }
                     Err(e) => {
-                        if let TypeNotFound = e.get_error_code() {
+                        if let TYPE_NOT_FOUND = e.get_error_code() {
                             Box::new(::std::iter::empty())
                         } else {
                             return Err(e);
@@ -257,7 +257,7 @@ impl MultiVersionGraph for GraphStore {
         }
         if self.vertex_manager.contains_type(si, label_id) {
             let msg = format!("vertex#{} already exists", label_id);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_vertex_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_vertex_type);
             return Err(err);
         }
         self.meta
@@ -282,7 +282,7 @@ impl MultiVersionGraph for GraphStore {
         }
         if !self.vertex_manager.contains_type(si, label_id) {
             let msg = format!("vertex#{} does not exist", label_id);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add_vertex_type_properties);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add_vertex_type_properties);
             return Err(err);
         }
         self.meta
@@ -307,7 +307,7 @@ impl MultiVersionGraph for GraphStore {
         }
         if self.edge_manager.contains_edge(label_id) {
             let msg = format!("edge#{} already exists", label_id);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_edge);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_edge);
             return Err(err);
         }
         self.meta
@@ -331,7 +331,7 @@ impl MultiVersionGraph for GraphStore {
         }
         if !self.edge_manager.contains_edge(label_id) {
             let msg = format!("edge#{} does not exist", label_id);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add_edge_type_properties);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add_edge_type_properties);
             return Err(err);
         }
         self.meta
@@ -358,7 +358,7 @@ impl MultiVersionGraph for GraphStore {
             .contains_edge_kind(si, edge_kind)
         {
             let msg = format!("{:?} already exists", edge_kind);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add_edge_kind, si, edge_kind);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add_edge_kind, si, edge_kind);
             return Err(err);
         }
         self.meta
@@ -633,7 +633,7 @@ impl MultiVersionGraph for GraphStore {
         let graph_def = self.meta.get_graph_def().lock()?;
         let pb = graph_def.to_proto()?;
         pb.write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))
     }
 
     fn prepare_data_load(
@@ -722,7 +722,7 @@ impl GraphStore {
             }
             unknown => {
                 let msg = format!("unknown storage {}", unknown);
-                let err = gen_graph_err!(GraphErrorCode::NotSupported, msg, open, config, path);
+                let err = gen_graph_err!(ErrorCode::UNSUPPORTED_OPERATION, msg, open, config, path);
                 Err(err)
             }
         }
@@ -819,7 +819,7 @@ impl GraphStore {
                 });
         }
         let msg = format!("table not found at {} of vertex#{}", si, info.get_label());
-        let err = gen_graph_err!(GraphErrorCode::DataNotExists, msg, do_insert_vertex_data);
+        let err = gen_graph_err!(ErrorCode::DATA_NOT_EXISTS, msg, do_insert_vertex_data);
         Err(err)
     }
 
@@ -840,7 +840,7 @@ impl GraphStore {
                 });
         }
         let msg = format!("table not found at {} of {:?}", si, info.get_type());
-        let err = gen_graph_err!(GraphErrorCode::DataNotExists, msg, do_insert_edge_data);
+        let err = gen_graph_err!(ErrorCode::DATA_NOT_EXISTS, msg, do_insert_edge_data);
         Err(err)
     }
 
@@ -848,7 +848,7 @@ impl GraphStore {
         let guard = self.si_guard.load(Ordering::Relaxed) as SnapshotId;
         if si < guard {
             let msg = format!("si#{} is less than current si_guard#{}", si, guard);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg);
             return Err(err);
         }
         Ok(())
@@ -955,7 +955,7 @@ impl GraphStore {
                         scan.into_iter()
                     }
                     Err(e) => {
-                        if let TypeNotFound = e.get_error_code() {
+                        if let TYPE_NOT_FOUND = e.get_error_code() {
                             Box::new(::std::iter::empty())
                         } else {
                             return Err(e);
@@ -1071,7 +1071,7 @@ impl GraphStore {
                     label_id, src_id, dst_id, direction
                 );
                 error!("{}", msg);
-                Err(gen_graph_err!(GraphErrorCode::DataNotExists, msg, get_edge_by_vertex))
+                Err(gen_graph_err!(ErrorCode::DATA_NOT_EXISTS, msg, get_edge_by_vertex))
             }
             Err(err) => Err(err),
         }
@@ -1081,7 +1081,7 @@ impl GraphStore {
         let statistics = self.get_statistics(si)?;
         let pb = statistics.to_proto()?;
         pb.write_to_bytes()
-            .map_err(|e| GraphError::new(InvalidData, format!("{:?}", e)))
+            .map_err(|e| GraphError::new(INVALID_DATA, format!("{:?}", e)))
     }
 
     pub fn get_statistics(&self, si: SnapshotId) -> GraphResult<GraphPartitionStatistics> {
diff --git a/interactive_engine/executor/store/groot/src/db/graph/table_manager.rs b/interactive_engine/executor/store/groot/src/db/graph/table_manager.rs
index af9165087066..df370d9db85d 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/table_manager.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/table_manager.rs
@@ -67,7 +67,7 @@ impl Table {
     pub fn from_bytes(bytes: &[u8]) -> GraphResult<Self> {
         if bytes.len() < 4 {
             let msg = format!("invalid bytes");
-            let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, from_bytes);
+            let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, from_bytes);
             return Err(err);
         }
         let reader = UnsafeBytesReader::new(bytes);
@@ -81,12 +81,12 @@ impl Table {
                     return Ok(ret);
                 }
                 let msg = format!("invalid bytes");
-                let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, from_bytes);
+                let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, from_bytes);
                 Err(err)
             }
             x => {
                 let msg = format!("unknown encoding version {}", x);
-                let err = gen_graph_err!(GraphErrorCode::InvalidData, msg, from_bytes);
+                let err = gen_graph_err!(ErrorCode::INVALID_DATA, msg, from_bytes);
                 return Err(err);
             }
         }
diff --git a/interactive_engine/executor/store/groot/src/db/graph/types/edge.rs b/interactive_engine/executor/store/groot/src/db/graph/types/edge.rs
index 78f1c6a2e1ab..763ffd0f7e20 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/types/edge.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/types/edge.rs
@@ -385,11 +385,11 @@ impl EdgeManagerInner {
                 }
             }
             let msg = format!("no {:?} is alive at {}", kind, si);
-            let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_edge_kind, si, kind);
+            let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_edge_kind, si, kind);
             return Err(err);
         }
         let msg = format!("edge {:?} not found", kind);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_edge_kind, si, kind);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_edge_kind, si, kind);
         Err(err)
     }
 
@@ -400,11 +400,11 @@ impl EdgeManagerInner {
                 return Ok(info.clone());
             }
             let msg = format!("edge#{} is not alive at {}", label, si);
-            let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_edge_info, si, label);
+            let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_edge_info, si, label);
             return Err(err);
         }
         let msg = format!("edge#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_edge_info, si, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_edge_info, si, label);
         Err(err)
     }
 
@@ -426,7 +426,7 @@ impl EdgeManagerInner {
     fn create_edge_type(&mut self, si: SnapshotId, label: LabelId, type_def: &TypeDef) -> GraphResult<()> {
         if self.info_map.contains_key(&label) {
             let msg = format!("edge#{} already exists", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_edge_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_edge_type);
             return Err(err);
         }
         let info = EdgeInfo::new(si, label);
@@ -440,7 +440,7 @@ impl EdgeManagerInner {
     fn update_edge_type(&mut self, si: SnapshotId, label: LabelId, type_def: &TypeDef) -> GraphResult<()> {
         if !self.info_map.contains_key(&label) {
             let msg = format!("edge#{} not found.", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, update_edge_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, update_edge_type);
             return Err(err);
         }
         if let Some(info) = self.info_map.get(&label) {
@@ -460,7 +460,7 @@ impl EdgeManagerInner {
             return Ok(());
         }
         let msg = format!("edge#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, drop_edge_type, si, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, drop_edge_type, si, label);
         Err(err)
     }
 
@@ -478,7 +478,7 @@ impl EdgeManagerInner {
             return Ok(());
         }
         let msg = format!("edge#{} not found", kind.edge_label_id);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_edge_kind, si, kind);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_edge_kind, si, kind);
         Err(err)
     }
 
@@ -488,7 +488,7 @@ impl EdgeManagerInner {
             return Ok(());
         }
         let msg = format!("edge#{:?} not found", kind);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, remove_edge_kind, si, kind);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, remove_edge_kind, si, kind);
         Err(err)
     }
 
diff --git a/interactive_engine/executor/store/groot/src/db/graph/types/vertex.rs b/interactive_engine/executor/store/groot/src/db/graph/types/vertex.rs
index 54dbf69a2ea0..3238079be7db 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/types/vertex.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/types/vertex.rs
@@ -108,7 +108,7 @@ impl VertexTypeManager {
     ) -> GraphResult<()> {
         if si != table0.start_si {
             let msg = format!("type si {} must be equal to table0.start_si {}", si, table0.start_si);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_type);
             return Err(err);
         }
         let guard = &epoch::pin();
@@ -116,12 +116,12 @@ impl VertexTypeManager {
         let mut map_clone = unsafe { map.as_ref() }
             .ok_or_else(|| {
                 let msg = "get map reference return `None`".to_string();
-                gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, label)
+                gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, label)
             })?
             .clone();
         if map_clone.contains_key(&label) {
             let msg = format!("vertex#{} already exists", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_type);
             return Err(err);
         }
         let info = VertexTypeInfo::new(si, label);
@@ -139,20 +139,20 @@ impl VertexTypeManager {
     ) -> GraphResult<()> {
         if si != table0.start_si {
             let msg = format!("type si {} must be equal to table0.start_si {}", si, table0.start_si);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, update_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, update_type);
             return Err(err);
         }
         let guard = &epoch::pin();
         let map = self.get_map(guard);
-        let mut map_clone = unsafe { map.as_ref() }
+        let map_clone = unsafe { map.as_ref() }
             .ok_or_else(|| {
                 let msg = "get map reference return `None`".to_string();
-                gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, label)
+                gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, label)
             })?
             .clone();
         if !map_clone.contains_key(&label) {
             let msg = format!("vertex#{} not found.", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, update_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, update_type);
             return Err(err);
         }
         if let Some(info) = map_clone.get(&label) {
@@ -169,18 +169,18 @@ impl VertexTypeManager {
         let map = self.get_map(&guard);
         let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, label)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, label)
         })?;
         if let Some(info) = map_ref.get(&label) {
             if info.is_alive_at(si) {
                 return Ok(info.clone());
             }
             let msg = format!("vertex#{} is not visible at {}", label, si);
-            let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get, si, label);
+            let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get, si, label);
             return Err(err);
         }
         let msg = format!("vertex#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get, si, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get, si, label);
         Err(err)
     }
 
@@ -189,7 +189,7 @@ impl VertexTypeManager {
         let map = self.get_map(&guard);
         let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, label)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, label)
         })?;
         if let Some(info) = map_ref.get(&label) {
             if info.is_alive_at(si) {
@@ -197,11 +197,11 @@ impl VertexTypeManager {
                 return Ok(ret);
             }
             let msg = format!("vertex#{} is not visible at {}", label, si);
-            let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get, si, label);
+            let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get, si, label);
             return Err(err);
         }
         let msg = format!("vertex#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get, si, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get, si, label);
         Err(err)
     }
 
@@ -210,7 +210,7 @@ impl VertexTypeManager {
         let map = self.get_map(&guard);
         let map_ref = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si, label)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si, label)
         })?;
         if let Some(info) = map_ref.get(&label) {
             info.lifetime.set_end(si);
@@ -223,7 +223,7 @@ impl VertexTypeManager {
         let map = self.get_map(guard);
         let map_ref: &VertexMap = unsafe { map.as_ref() }.ok_or_else(|| {
             let msg = "get map reference return `None`".to_string();
-            gen_graph_err!(GraphErrorCode::InvalidData, msg, get_map, si)
+            gen_graph_err!(ErrorCode::INVALID_DATA, msg, get_map, si)
         })?;
         let mut b = Vec::new();
         let mut table_ids = Vec::new();
@@ -262,7 +262,7 @@ impl VertexTypeManagerBuilder {
     pub fn create(&mut self, si: SnapshotId, label: LabelId, type_def: &TypeDef) -> GraphResult<()> {
         if self.map.contains_key(&label) {
             let msg = format!("vertex#{} already exists", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create, si, label, type_def);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create, si, label, type_def);
             return Err(err);
         }
         let info = VertexTypeInfo::new(si, label);
@@ -275,7 +275,7 @@ impl VertexTypeManagerBuilder {
     pub fn update_type(&mut self, si: SnapshotId, label: LabelId, type_def: &TypeDef) -> GraphResult<()> {
         if !self.map.contains_key(&label) {
             let msg = format!("vertex#{} not found.", label);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, create_type);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, create_type);
             return Err(err);
         }
         if let Some(info) = self.map.get(&label) {
@@ -291,7 +291,7 @@ impl VertexTypeManagerBuilder {
             return Ok(());
         }
         let msg = format!("vertex#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, drop, si, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, drop, si, label);
         Err(err)
     }
 
@@ -302,7 +302,7 @@ impl VertexTypeManagerBuilder {
             }
         }
         let msg = format!("vertex#{} not found", label);
-        let err = gen_graph_err!(GraphErrorCode::TypeNotFound, msg, get_info_mut, label);
+        let err = gen_graph_err!(ErrorCode::TYPE_NOT_FOUND, msg, get_info_mut, label);
         Err(err)
     }
 
diff --git a/interactive_engine/executor/store/groot/src/db/graph/version.rs b/interactive_engine/executor/store/groot/src/db/graph/version.rs
index 7a3613104afe..1f7f367f7588 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/version.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/version.rs
@@ -68,7 +68,7 @@ impl VersionManager {
     pub fn add(&self, si: SnapshotId, data: i64) -> GraphResult<()> {
         if data == TOMBSTONE {
             let msg = format!("cannot using this interface to add tombstone");
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, add, si, data);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, add, si, data);
             return Err(err);
         }
         let res = self.do_add_data(si, data);
@@ -101,7 +101,7 @@ impl VersionManager {
             let _data = self.slots[idx].get_data();
             if cur_si == 0 {
                 let msg = format!("cur_si should not be 0! Maybe thread unsafe");
-                let err = gen_graph_err!(GraphErrorCode::GraphStoreBug, msg, gc, si);
+                let err = gen_graph_err!(ErrorCode::ILLEGAL_STATE, msg, gc, si);
                 return Err(err);
             }
             if cur_si <= si {
@@ -127,13 +127,13 @@ impl VersionManager {
     fn do_add_data(&self, si: SnapshotId, data: i64) -> GraphResult<()> {
         if si <= 0 {
             let msg = format!("cannot add data with version less equal than 0");
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, do_add_data, si, data);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, do_add_data, si, data);
             return Err(err);
         }
         let _guard = res_unwrap!(self.lock.lock(), add, si, data)?;
         if self.size() >= MAX_SIZE {
             let msg = format!("version count exceed limit {}", MAX_SIZE);
-            let err = gen_graph_err!(GraphErrorCode::TooManyVersions, msg, do_add_data, si, data);
+            let err = gen_graph_err!(ErrorCode::TOO_MANY_VERSIONS, msg, do_add_data, si, data);
             return Err(err);
         }
         let tail = self.get_tail();
@@ -145,7 +145,7 @@ impl VersionManager {
             if last_si >= si {
                 let msg =
                     format!("version {} is less equal than last version {}, it's invalid", si, last_si);
-                let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, do_add_data, si, data);
+                let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, do_add_data, si, data);
                 return Err(err);
             }
         }
diff --git a/interactive_engine/executor/store/groot/src/db/proto/mod.rs b/interactive_engine/executor/store/groot/src/db/proto/mod.rs
index 0c6572aa77d1..6b05a0fcc8d5 100644
--- a/interactive_engine/executor/store/groot/src/db/proto/mod.rs
+++ b/interactive_engine/executor/store/groot/src/db/proto/mod.rs
@@ -4,3 +4,5 @@ pub mod schema_common;
 pub mod model;
 #[rustfmt::skip]
 pub mod schema;
+#[rustfmt::skip]
+pub mod insight;
diff --git a/interactive_engine/executor/store/groot/src/db/storage/rocksdb.rs b/interactive_engine/executor/store/groot/src/db/storage/rocksdb.rs
index 26b704972de6..50488abb6983 100644
--- a/interactive_engine/executor/store/groot/src/db/storage/rocksdb.rs
+++ b/interactive_engine/executor/store/groot/src/db/storage/rocksdb.rs
@@ -32,7 +32,7 @@ impl RocksDB {
             .expect("invalid config, missing store.data.path");
         let db = DB::open(&opts, path).map_err(|e| {
             let msg = format!("open rocksdb at {} failed: {}", path, e.into_string());
-            gen_graph_err!(GraphErrorCode::ExternalStorageError, msg, open, options, path)
+            gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg, open, options, path)
         })?;
         let ret = RocksDB { db: Atomic::new(Arc::new(db)), options: options.clone(), is_secondary: false };
         Ok(ret)
@@ -41,7 +41,7 @@ impl RocksDB {
     pub fn open_as_secondary(options: &HashMap<String, String>) -> GraphResult<Self> {
         let db = RocksDB::open_helper(options, false).map_err(|e| {
             let msg = format!("open rocksdb at {:?}, error: {:?}", options, e);
-            gen_graph_err!(GraphErrorCode::ExternalStorageError, msg, open_as_secondary)
+            gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg, open_as_secondary)
         })?;
 
         let ret = RocksDB { db: Atomic::new(Arc::new(db)), options: options.clone(), is_secondary: true };
@@ -107,13 +107,13 @@ impl RocksDB {
                 Ok(None) => Ok(None),
                 Err(e) => {
                     let msg = format!("rocksdb.get failed because {}", e.into_string());
-                    let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+                    let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
                     Err(err)
                 }
             }
         } else {
             let msg = format!("rocksdb.get failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -128,11 +128,11 @@ impl RocksDB {
         if let Some(db) = unsafe { db_shared.as_ref() } {
             db.put(key, val).map_err(|e| {
                 let msg = format!("rocksdb.put failed because {}", e.into_string());
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })
         } else {
             let msg = format!("rocksdb.put failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -147,11 +147,11 @@ impl RocksDB {
         if let Some(db) = unsafe { db_shared.as_ref() } {
             db.delete(key).map_err(|e| {
                 let msg = format!("rocksdb.delete failed because {}", e.into_string());
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })
         } else {
             let msg = format!("rocksdb.delete failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -163,7 +163,7 @@ impl RocksDB {
             Ok(StorageIter::RocksDB(RocksDBIter::new_prefix(db.clone(), prefix, guard)))
         } else {
             let msg = format!("rocksdb.scan_prefix failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -175,7 +175,7 @@ impl RocksDB {
             Ok(StorageIter::RocksDB(RocksDBIter::new_start(db.clone(), start, guard)))
         } else {
             let msg = format!("rocksdb.scan_from failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -187,7 +187,7 @@ impl RocksDB {
             Ok(StorageIter::RocksDB(RocksDBIter::new_range(db.clone(), start, end, guard)))
         } else {
             let msg = format!("rocksdb.new_range failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -205,7 +205,7 @@ impl RocksDB {
             batch.delete_range(start, end);
             db.write(batch).map_err(|e| {
                 let msg = format!("rocksdb.delete_range failed because {}", e.into_string());
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })?;
             let mut val = false;
             if let Some(conf_str) = self
@@ -220,7 +220,7 @@ impl RocksDB {
             Ok(())
         } else {
             let msg = format!("rocksdb.delete_range failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -240,7 +240,7 @@ impl RocksDB {
             Ok(())
         } else {
             let msg = format!("rocksdb.compact failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -258,11 +258,11 @@ impl RocksDB {
             db.ingest_external_file_opts(&options, files.to_vec())
                 .map_err(|e| {
                     let msg = format!("rocksdb.load file {:?} failed because {}", files, e.into_string());
-                    gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                    gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
                 })
         } else {
             let msg = format!("rocksdb.load failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -274,11 +274,11 @@ impl RocksDB {
                 backup_path.to_string(),
                 e.into_string()
             );
-            gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+            gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
         })?;
         let env = Env::new().map_err(|e| {
             let msg = format!("Gen rocksdb Env failed because {}", e.into_string());
-            gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+            gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
         })?;
         let backup_engine = BackupEngine::open(&backup_opts, &env).map_err(|e| {
             let msg = format!(
@@ -286,7 +286,7 @@ impl RocksDB {
                 backup_path.to_string(),
                 e.into_string()
             );
-            gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+            gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
         })?;
         let guard = epoch::pin();
         let db_shared = self.get_db(&guard);
@@ -295,7 +295,7 @@ impl RocksDB {
             Ok(Box::from(ret))
         } else {
             let msg = format!("open rocksdb backup engine failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -307,7 +307,7 @@ impl RocksDB {
             Ok(Box::new(Scan::new(db.clone(), prefix, guard)))
         } else {
             let msg = format!("rocksdb.new_scan failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -321,11 +321,11 @@ impl RocksDB {
         if let Some(db) = unsafe { db_shared.as_ref() } {
             db.try_catch_up_with_primary().map_err(|e| {
                 let msg = format!("rocksdb.try_catch_up_with_primary failed because {:?}", e);
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })
         } else {
             let msg = format!("rocksdb.try_catch_up_with_primary failed because the acquired db is `None`");
-            let err = gen_graph_err!(GraphErrorCode::ExternalStorageError, msg);
+            let err = gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg);
             Err(err)
         }
     }
@@ -338,7 +338,7 @@ impl RocksDB {
             std::thread::sleep(Duration::from_secs(wait_sec));
             let db = RocksDB::open_helper(&self.options, true).map_err(|e| {
                 let msg = format!("open rocksdb at {:?}, error: {:?}", self.options, e);
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg, open_as_secondary)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg, open_as_secondary)
             })?;
             let ret = db.try_catch_up_with_primary();
             if ret.is_err() {
@@ -381,12 +381,12 @@ impl RocksDBBackupEngine {
             .create_new_backup(&self.db)
             .map_err(|e| {
                 let msg = format!("create new rocksdb backup failed, because {}", e.into_string());
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })?;
         let after = self.get_backup_list();
         if after.len() != before.len() + 1 {
             let msg = "get new created rocksdb backup id failed".to_string();
-            return Err(gen_graph_err!(GraphErrorCode::ExternalStorageError, msg));
+            return Err(gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg));
         }
         let new_backup_id = *after.iter().max().unwrap();
         Ok(new_backup_id)
@@ -410,7 +410,7 @@ impl RocksDBBackupEngine {
                     backup_id,
                     e.into_string()
                 );
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })?;
         Ok(())
     }
@@ -421,7 +421,7 @@ impl RocksDBBackupEngine {
             .map_err(|e| {
                 let msg =
                     format!("rocksdb backup {} verify failed, because {}", backup_id, e.into_string());
-                gen_graph_err!(GraphErrorCode::ExternalStorageError, msg)
+                gen_graph_err!(ErrorCode::EXTERNAL_STORAGE_ERROR, msg)
             })?;
         Ok(())
     }
diff --git a/interactive_engine/executor/store/groot/src/db/util/lock.rs b/interactive_engine/executor/store/groot/src/db/util/lock.rs
index 81ecc6909bda..7feaefce314a 100644
--- a/interactive_engine/executor/store/groot/src/db/util/lock.rs
+++ b/interactive_engine/executor/store/groot/src/db/util/lock.rs
@@ -18,7 +18,7 @@ impl<T> GraphMutexLock<T> {
             .map(|guard| GraphMutexLockGuard::new(guard))
             .map_err(|e| {
                 let msg = format!("{:?}", e);
-                gen_graph_err!(GraphErrorCode::LockFailed, msg, lock)
+                gen_graph_err!(ErrorCode::LOCK_FAILED, msg, lock)
             })
     }
 }
diff --git a/interactive_engine/frontend/src/main/java/com/alibaba/graphscope/frontend/VineyardIrMetaReader.java b/interactive_engine/frontend/src/main/java/com/alibaba/graphscope/frontend/VineyardIrMetaReader.java
index fa550eec6571..90e6e500a838 100644
--- a/interactive_engine/frontend/src/main/java/com/alibaba/graphscope/frontend/VineyardIrMetaReader.java
+++ b/interactive_engine/frontend/src/main/java/com/alibaba/graphscope/frontend/VineyardIrMetaReader.java
@@ -22,12 +22,12 @@
 import com.alibaba.graphscope.common.ir.meta.IrMeta;
 import com.alibaba.graphscope.common.ir.meta.reader.IrMetaReader;
 import com.alibaba.graphscope.common.ir.meta.schema.IrGraphSchema;
+import com.alibaba.graphscope.groot.common.exception.UnimplementedException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
 import com.alibaba.graphscope.groot.common.schema.api.GraphStatistics;
 import com.alibaba.graphscope.groot.common.schema.impl.DefaultGraphSchema;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.NotImplementedException;
 
 import java.io.File;
 import java.io.IOException;
@@ -51,9 +51,9 @@ public IrMeta readMeta() throws IOException {
     }
 
     @Override
-    public GraphStatistics readStats(GraphId graphId) throws IOException {
+    public GraphStatistics readStats(GraphId graphId) {
         // TODO: support statistics, otherwise, the CBO will not work
-        throw new NotImplementedException(
+        throw new UnimplementedException(
                 "reading graph statistics in vineyard is unimplemented yet");
     }
 }
diff --git a/interactive_engine/groot-client/pom.xml b/interactive_engine/groot-client/pom.xml
index 05e0c3e27b3c..6e98a5525928 100644
--- a/interactive_engine/groot-client/pom.xml
+++ b/interactive_engine/groot-client/pom.xml
@@ -98,6 +98,7 @@
                 <include>ddl_service.proto</include>
                 <include>write_service.proto</include>
                 <include>request_option.proto</include>
+                <include>error/insight.proto</include>
               </includes>
             </configuration>
             <goals>
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/Utils.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/Utils.java
index 301b016dac90..3bcdaddea5ee 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/Utils.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/Utils.java
@@ -18,6 +18,7 @@
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.DiscoveryConfig;
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.operation.OperationBatch;
 import com.alibaba.graphscope.groot.operation.OperationBlob;
 import com.alibaba.graphscope.groot.operation.OperationType;
@@ -61,7 +62,7 @@ public static String getHostTemplate(Configs configs, RoleType role) {
                 svcName = String.format(svcTemplate, releaseName, "store");
                 break;
             default:
-                throw new IllegalArgumentException("invalid role [" + role + "]");
+                throw new InvalidArgumentException("invalid role [" + role + "]");
         }
         String dnsTemplate = "%s-{}.%s-headless";
         return String.format(dnsTemplate, svcName, svcName);
@@ -97,18 +98,18 @@ public static int getPort(Configs configs, RoleType role, int idx) {
                 s = CommonConfig.GAIA_ENGINE_PORT.get(configs);
                 break;
             default:
-                throw new IllegalArgumentException("invalid role [" + role + "]");
+                throw new InvalidArgumentException("invalid role [" + role + "]");
         }
         if (s.isEmpty()) { // For backward compatibility
             return CommonConfig.RPC_PORT.get(configs);
         } else {
             String[] array = s.split(",");
             if (idx >= array.length) {
-                // throw new IllegalArgumentException("Invalid index " + idx + " of " + s);
+                // throw new InvalidArgumentException("Invalid index " + idx + " of " + s);
                 idx = 0; // Just use the first one. In this case, assume they are in different pods.
             }
             if (array[idx].isEmpty()) {
-                throw new IllegalArgumentException("Invalid port " + array[idx] + " of " + role);
+                throw new InvalidArgumentException("Invalid port " + array[idx] + " of " + role);
             }
             return Integer.parseInt(array[idx]);
         }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/CoordinatorSnapshotClient.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/CoordinatorSnapshotClient.java
index 6d1d291479d0..35932ec189f9 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/CoordinatorSnapshotClient.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/CoordinatorSnapshotClient.java
@@ -1,5 +1,6 @@
 package com.alibaba.graphscope.groot.coordinator;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.rpc.RpcChannel;
 import com.alibaba.graphscope.groot.rpc.RpcClient;
 import com.alibaba.graphscope.proto.groot.*;
@@ -24,7 +25,8 @@ public void synchronizeSnapshot(long snapshotId) throws RuntimeException {
                 SynchronizeMinQuerySnapshotIdRequest.newBuilder().setSnapshotId(snapshotId).build();
         SynchronizeMinQuerySnapshotIdResponse res = getStub().synchronizeMinQuerySnapshotId(req);
         if (!res.getSuccess()) {
-            throw new RuntimeException("Synchronize snapshot to store failed: " + res.getErrMsg());
+            throw new InvalidArgumentException(
+                    "Synchronize snapshot to store failed: " + res.getErrMsg());
         }
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/GraphInitializer.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/GraphInitializer.java
index a51a00cf264b..1a51f3e99bb3 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/GraphInitializer.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/GraphInitializer.java
@@ -14,7 +14,7 @@
 package com.alibaba.graphscope.groot.coordinator;
 
 import com.alibaba.graphscope.groot.common.config.*;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.util.BackupInfo;
 import com.alibaba.graphscope.groot.coordinator.backup.BackupManager;
 import com.alibaba.graphscope.groot.meta.MetaStore;
@@ -52,7 +52,7 @@ public void initializeIfNeeded() {
             initializeZkIfNeeded();
             initializeMetaIfNeeded();
         } catch (Exception e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/IdAllocator.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/IdAllocator.java
index 130583aaa3b5..47fc60d5aabd 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/IdAllocator.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/IdAllocator.java
@@ -1,10 +1,10 @@
 package com.alibaba.graphscope.groot.coordinator;
 
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
+import com.alibaba.graphscope.groot.common.exception.NotFoundException;
 import com.alibaba.graphscope.groot.meta.MetaStore;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 
 public class IdAllocator {
@@ -24,7 +24,7 @@ public void start() {
         try {
             recover();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
     }
 
@@ -34,7 +34,7 @@ public void stop() {
 
     private void recover() throws IOException {
         if (!this.metaStore.exists(ID_ALLOCATE_INFO_PATH)) {
-            throw new FileNotFoundException(ID_ALLOCATE_INFO_PATH);
+            throw new NotFoundException("File not found: " + ID_ALLOCATE_INFO_PATH);
         }
         byte[] b = this.metaStore.read(ID_ALLOCATE_INFO_PATH);
         this.tailId = this.objectMapper.readValue(b, Long.class);
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SchemaService.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SchemaService.java
index 6453b3154d8b..579003af4e01 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SchemaService.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SchemaService.java
@@ -14,7 +14,7 @@
 package com.alibaba.graphscope.groot.coordinator;
 
 import com.alibaba.graphscope.groot.CompletionCallback;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.schema.request.DdlRequestBatch;
 import com.alibaba.graphscope.proto.groot.SchemaGrpc;
 import com.alibaba.graphscope.proto.groot.SubmitBatchDdlRequest;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SnapshotManager.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SnapshotManager.java
index 5e733d4c6515..cd755f7299b5 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SnapshotManager.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/SnapshotManager.java
@@ -17,8 +17,8 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.CoordinatorConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
-import com.alibaba.graphscope.groot.common.exception.ServiceNotReadyException;
+import com.alibaba.graphscope.groot.common.exception.*;
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
 import com.alibaba.graphscope.groot.common.util.ThreadFactoryUtils;
 import com.alibaba.graphscope.groot.meta.MetaStore;
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -160,7 +160,7 @@ public void start() {
         try {
             recover();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
 
         this.increaseWriteSnapshotIdScheduler =
@@ -219,7 +219,7 @@ public void stop() {
 
     private void checkMetaPath(String path) throws FileNotFoundException {
         if (!this.metaStore.exists(path)) {
-            throw new FileNotFoundException(path);
+            throw new NotFoundException("File not found: " + path);
         }
     }
 
@@ -276,7 +276,7 @@ public synchronized void commitSnapshotId(
                         // Queue count of each store is fixed: 1
                         if (1 != offsets.size()) {
                             String msg = String.format("committed offset is %s", offsets);
-                            throw new IllegalArgumentException(msg);
+                            throw new InvalidArgumentException(msg);
                         }
                         if (v > offsets.get(0)) {
                             return v;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/backup/BackupManager.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/backup/BackupManager.java
index f6210d967357..da6eb096d2f0 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/backup/BackupManager.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/coordinator/backup/BackupManager.java
@@ -18,8 +18,7 @@
 import com.alibaba.graphscope.groot.common.config.BackupConfig;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.BackupException;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.*;
 import com.alibaba.graphscope.groot.common.util.BackupInfo;
 import com.alibaba.graphscope.groot.common.util.ThreadFactoryUtils;
 import com.alibaba.graphscope.groot.coordinator.QuerySnapshotListener;
@@ -36,7 +35,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.*;
@@ -116,7 +114,7 @@ public void start() {
         try {
             recover();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
 
         this.localListener = new LocalSnapshotListener(this.schemaManager, this.localSnapshotCache);
@@ -226,7 +224,7 @@ public void deleteBackup(int globalBackupId) throws BackupException, IOException
     public void purgeOldBackups(int keepAliveNum) throws BackupException, IOException {
         checkEnable();
         if (keepAliveNum <= 0) {
-            throw new IllegalArgumentException(
+            throw new InvalidArgumentException(
                     "the input keepAliveNum should > 0, got " + keepAliveNum);
         } else if (keepAliveNum >= this.globalBackupIdToInfo.size()) {
             return;
@@ -302,9 +300,9 @@ private void checkEnable() throws BackupException {
         }
     }
 
-    private void checkMetaPath(String path) throws FileNotFoundException {
+    private void checkMetaPath(String path) {
         if (!this.metaStore.exists(path)) {
-            throw new FileNotFoundException(path);
+            throw new NotFoundException("File not found: " + path);
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/DiscoveryFactory.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/DiscoveryFactory.java
index 7dce53432b3b..b803f4e980a7 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/DiscoveryFactory.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/DiscoveryFactory.java
@@ -16,6 +16,7 @@
 import com.alibaba.graphscope.groot.CuratorUtils;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 
 import org.apache.curator.framework.CuratorFramework;
 
@@ -45,7 +46,7 @@ public NodeDiscovery makeDiscovery(LocalNodeProvider localNodeProvider) {
             case "ZOOKEEPER":
                 return new ZkDiscovery(this.configs, localNodeProvider, getCurator());
             default:
-                throw new IllegalArgumentException(
+                throw new InvalidArgumentException(
                         "invalid discovery mode [" + discoveryMode + "]");
         }
     }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/GrootNode.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/GrootNode.java
index 69f477b5f265..296288be2e92 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/GrootNode.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/GrootNode.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.NetworkFailureException;
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -58,7 +58,7 @@ public static GrootNode createGraphNode(RoleType role, Configs configs, int port
             try {
                 host = InetAddress.getLocalHost().getHostAddress();
             } catch (UnknownHostException e) {
-                throw new GrootException(e);
+                throw new NetworkFailureException(e);
             }
         }
         return new GrootNode(role.getName(), idx, host, port);
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/LocalNodeProvider.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/LocalNodeProvider.java
index ddcae785033e..2e3e8444d4f3 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/LocalNodeProvider.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/LocalNodeProvider.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
@@ -43,7 +43,7 @@ public GrootNode apply(Integer port) {
                         null, GrootNode.createGraphNode(roleType, configs, port));
         if (!suc) {
             if (!CommonConfig.DISCOVERY_MODE.get(this.configs).equalsIgnoreCase("file")) {
-                throw new GrootException("localNode can only be set once");
+                throw new UnsupportedOperationException("localNode can only be set once");
             }
         }
         return localNodeRef.get();
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/ZkDiscovery.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/ZkDiscovery.java
index 137244c2a617..705e62061eba 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/ZkDiscovery.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/discovery/ZkDiscovery.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.ZkConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.util.ThreadFactoryUtils;
 
 import org.apache.curator.framework.CuratorFramework;
@@ -115,7 +115,7 @@ public void start() {
                 this.serviceCaches.add(serviceCache);
             }
         } catch (Exception e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         logger.info("ZkDiscovery started");
     }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/BatchDdlClient.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/BatchDdlClient.java
index d755fccdaf24..3deeff2ab380 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/BatchDdlClient.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/BatchDdlClient.java
@@ -1,10 +1,10 @@
 package com.alibaba.graphscope.groot.frontend;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.util.UuidUtils;
 import com.alibaba.graphscope.groot.rpc.RoleClients;
 import com.alibaba.graphscope.groot.schema.ddl.DdlExecutors;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.groot.schema.request.DdlRequestBatch;
 import com.google.protobuf.InvalidProtocolBufferException;
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/ClientService.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/ClientService.java
index da8ed2678ccb..48f64d721751 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/ClientService.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/ClientService.java
@@ -320,6 +320,7 @@ public void ingestData(
         AtomicBoolean finished = new AtomicBoolean(false);
         for (int i = 0; i < storeCount; i++) {
             logger.info("Store [" + i + "] started to ingest...");
+            int finalI = i;
             this.frontendStoreClients
                     .getClient(i)
                     .storeIngest(
@@ -335,7 +336,8 @@ public void onCompleted(Void res) {
 
                                 @Override
                                 public void onError(Throwable t) {
-                                    logger.error("failed ingest", t);
+                                    logger.error(
+                                            "store {} ingest from {} failed", finalI, dataPath, t);
                                     finish(t);
                                 }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/GrootDdlService.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/GrootDdlService.java
index ec95ded3ee11..0a8708f1e4e5 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/GrootDdlService.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/GrootDdlService.java
@@ -13,6 +13,8 @@
  */
 package com.alibaba.graphscope.groot.frontend;
 
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.DataType;
 import com.alibaba.graphscope.groot.common.schema.wrapper.EdgeKind;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
@@ -222,7 +224,7 @@ private TypeDefPb toTypeDefPb(TypeDef typeDef) {
                 builder.setTypeEnum(TypeEnumPb.EDGE);
                 break;
             default:
-                throw new IllegalArgumentException(
+                throw new InvalidArgumentException(
                         "Invalid type enum [" + typeDef.getTypeEnum() + "]");
         }
         for (PropertyDef property : typeDef.getProperties()) {
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SchemaClient.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SchemaClient.java
index 692f11cc981d..177e742d3d48 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SchemaClient.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SchemaClient.java
@@ -13,9 +13,9 @@
  */
 package com.alibaba.graphscope.groot.frontend;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.rpc.RpcChannel;
 import com.alibaba.graphscope.groot.rpc.RpcClient;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.DdlRequestBatchPb;
 import com.alibaba.graphscope.proto.groot.SchemaGrpc;
 import com.alibaba.graphscope.proto.groot.SubmitBatchDdlRequest;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotCache.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotCache.java
index 39b53be82dd1..4f4a0254ea83 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotCache.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotCache.java
@@ -15,6 +15,7 @@
 
 import com.alibaba.graphscope.groot.SnapshotListener;
 import com.alibaba.graphscope.groot.SnapshotWithSchema;
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphStatistics;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotUpdateClient.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotUpdateClient.java
index 94fa48992339..b968b23be66b 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotUpdateClient.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/SnapshotUpdateClient.java
@@ -16,6 +16,7 @@
 
 package com.alibaba.graphscope.groot.frontend;
 
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.rpc.RpcChannel;
 import com.alibaba.graphscope.groot.rpc.RpcClient;
 import com.alibaba.graphscope.proto.groot.CoordinatorSnapshotServiceGrpc;
@@ -45,7 +46,7 @@ public void updateSnapshot(int frontendId, long snapshotId) throws RuntimeExcept
                         .build();
         UpdateMinQuerySnapshotIdResponse res = getStub().updateMinQuerySnapshotId(req);
         if (!res.getSuccess()) {
-            throw new RuntimeException("update snapshot fail {} " + res.getErrMsg());
+            throw new InternalException("update snapshot fail {} " + res.getErrMsg());
         }
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/WrappedSchemaFetcher.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/WrappedSchemaFetcher.java
index 54ffe13606d6..8d5df033a6e1 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/WrappedSchemaFetcher.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/WrappedSchemaFetcher.java
@@ -14,6 +14,7 @@
 package com.alibaba.graphscope.groot.frontend;
 
 import com.alibaba.graphscope.groot.SnapshotWithSchema;
+import com.alibaba.graphscope.groot.common.exception.UnimplementedException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
 import com.alibaba.graphscope.groot.common.schema.api.GraphStatistics;
 import com.alibaba.graphscope.groot.common.schema.api.SchemaFetcher;
@@ -61,6 +62,6 @@ public int getPartitionNum() {
 
     @Override
     public int getVersion() {
-        throw new UnsupportedOperationException();
+        throw new UnimplementedException();
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/DefaultEdgeIdGenerator.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/DefaultEdgeIdGenerator.java
index e427d9eaf214..39d62db8a028 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/DefaultEdgeIdGenerator.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/DefaultEdgeIdGenerator.java
@@ -3,6 +3,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 import com.alibaba.graphscope.groot.common.util.PkHashUtils;
 import com.alibaba.graphscope.groot.rpc.ChannelManager;
 import com.alibaba.graphscope.groot.rpc.RoleClients;
@@ -40,7 +41,7 @@ public long getNextId() {
     @Override
     public long getHashId(long srcId, long dstId, int labelId, List<byte[]> pks) {
         if (pks == null || pks.size() == 0) {
-            throw new RuntimeException("Cannot get hash id when pk is empty");
+            throw new UnsupportedOperationException("Cannot get hash id when pk is empty");
         }
         return PkHashUtils.hash(srcId, dstId, labelId, pks);
     }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/GraphWriter.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/GraphWriter.java
index 380a02cd15c6..4c0731dadb36 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/GraphWriter.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/GraphWriter.java
@@ -2,7 +2,8 @@
 
 import com.alibaba.graphscope.groot.CompletionCallback;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.PropertyDefNotFoundException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+import com.alibaba.graphscope.groot.common.exception.NotFoundException;
 import com.alibaba.graphscope.groot.common.schema.api.GraphElement;
 import com.alibaba.graphscope.groot.common.schema.api.GraphProperty;
 import com.alibaba.graphscope.groot.common.schema.api.GraphSchema;
@@ -122,7 +123,7 @@ public void writeBatch(
                     addClearEdgePropertiesOperation(batchBuilder, schema, dataRecord);
                     break;
                 default:
-                    throw new IllegalArgumentException(
+                    throw new InvalidArgumentException(
                             "Invalid operationType [" + operationType + "]");
             }
         }
@@ -300,7 +301,7 @@ public static Map<Integer, PropertyValue> parseRawProperties(
                     (propertyName, valString) -> {
                         GraphProperty propertyDef = graphElement.getProperty(propertyName);
                         if (propertyDef == null) {
-                            throw new PropertyDefNotFoundException(
+                            throw new NotFoundException(
                                     "property ["
                                             + propertyName
                                             + "] not found in ["
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/KafkaAppender.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/KafkaAppender.java
index 1776aa2b003d..283f0ddd7a97 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/KafkaAppender.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/KafkaAppender.java
@@ -7,7 +7,8 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.FrontendConfig;
-import com.alibaba.graphscope.groot.common.exception.IngestRejectException;
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.QueueRejectException;
 import com.alibaba.graphscope.groot.common.util.PartitionUtils;
 import com.alibaba.graphscope.groot.meta.MetaService;
 import com.alibaba.graphscope.groot.operation.OperationBatch;
@@ -118,7 +119,7 @@ public void ingestBatch(
         boolean suc = this.ingestBuffer.offer(new IngestTask(requestId, operationBatch, callback));
         if (!suc) {
             logger.warn("ingest buffer is full");
-            throw new IngestRejectException("add ingestTask to buffer failed");
+            throw new QueueRejectException("add ingestTask to buffer failed");
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/WriteRequest.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/WriteRequest.java
index 5eee9c78b4d2..4ce0476ef9e2 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/WriteRequest.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/frontend/write/WriteRequest.java
@@ -1,5 +1,6 @@
 package com.alibaba.graphscope.groot.frontend.write;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.common.util.EdgeRecordKey;
 import com.alibaba.graphscope.groot.common.util.VertexRecordKey;
 import com.alibaba.graphscope.groot.operation.OperationType;
@@ -46,7 +47,7 @@ public static WriteRequest parseProto(WriteRequestPb proto) {
                 return buildWriteEdgeRequest(
                         writeTypePb, new DataRecord(edgeRecordKey, properties));
             default:
-                throw new IllegalArgumentException(
+                throw new InvalidArgumentException(
                         "Invalid record key case [" + recordKeyCase + "]");
         }
     }
@@ -62,7 +63,7 @@ private static WriteRequest buildWriteVertexRequest(WriteTypePb typePb, DataReco
             case CLEAR_PROPERTY:
                 return new WriteRequest(OperationType.CLEAR_VERTEX_PROPERTIES, dataRecord);
             default:
-                throw new IllegalArgumentException("Invalid write type [" + typePb + "]");
+                throw new InvalidArgumentException("Invalid write type [" + typePb + "]");
         }
     }
 
@@ -77,7 +78,7 @@ private static WriteRequest buildWriteEdgeRequest(WriteTypePb typePb, DataRecord
             case CLEAR_PROPERTY:
                 return new WriteRequest(OperationType.CLEAR_EDGE_PROPERTIES, dataRecord);
             default:
-                throw new IllegalArgumentException("Invalid write type [" + typePb + "]");
+                throw new InvalidArgumentException("Invalid write type [" + typePb + "]");
         }
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/FileMetaStore.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/FileMetaStore.java
index 9c947c19a188..09825f1fa760 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/FileMetaStore.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/FileMetaStore.java
@@ -13,6 +13,8 @@
  */
 package com.alibaba.graphscope.groot.meta;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidDataException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,7 +79,8 @@ private SimpleImmutableEntry<Long, byte[]> readEntry(String path) throws IOExcep
                 int ignored = is.read(res);
                 long realCrc = getCRC32Checksum(res);
                 if (realCrc != crc) {
-                    throw new IOException("Checksum mismatch for " + file.getAbsolutePath());
+                    throw new InvalidDataException(
+                            "Checksum mismatch for " + file.getAbsolutePath());
                 }
             }
         }
@@ -111,7 +114,7 @@ public byte[] read(String path) throws IOException {
         } else if (res1 != null) {
             return res1;
         } else {
-            throw new IOException("File maybe corrupted: " + path);
+            throw new InvalidDataException("File maybe corrupted: " + path);
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/ZkMetaStore.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/ZkMetaStore.java
index a83a989f3afa..23915bd36258 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/ZkMetaStore.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/meta/ZkMetaStore.java
@@ -15,7 +15,7 @@
 
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.ZkConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.utils.ZKPaths;
@@ -48,7 +48,7 @@ public boolean exists(String path) {
         try {
             stat = this.curator.checkExists().forPath(fullPath);
         } catch (Exception e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         return stat != null;
     }
@@ -60,7 +60,7 @@ public byte[] read(String path) throws IOException {
         try {
             data = this.curator.getData().forPath(fullPath);
         } catch (Exception e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         }
         return data;
     }
@@ -75,7 +75,7 @@ public void write(String path, byte[] content) throws IOException {
                 this.curator.create().creatingParentsIfNeeded().forPath(fullPath, content);
             }
         } catch (Exception e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         }
     }
 
@@ -85,7 +85,7 @@ public void delete(String path) throws IOException {
         try {
             this.curator.delete().forPath(fullPath);
         } catch (Exception e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         }
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationBatch.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationBatch.java
index 921161f8271c..b57533049342 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationBatch.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationBatch.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.operation;
 
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
 import com.alibaba.graphscope.proto.groot.OperationBatchPb;
 import com.alibaba.graphscope.proto.groot.OperationPb;
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationType.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationType.java
index ae16576a0b0b..1a9c15b203c4 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationType.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/operation/OperationType.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.operation;
 
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.proto.groot.OpTypePb;
 
 public enum OperationType {
@@ -55,7 +56,7 @@ public byte getId() {
 
     public static OperationType fromId(byte id) {
         if (id < 0 || id >= TYPES.length) {
-            throw new IllegalArgumentException("Unknown OperationType: [" + id + "]");
+            throw new InvalidArgumentException("Unknown OperationType: [" + id + "]");
         }
         return TYPES[id];
     }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/rpc/ChannelManager.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/rpc/ChannelManager.java
index 73c8e65a1baf..c5ad10469298 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/rpc/ChannelManager.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/rpc/ChannelManager.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.Utils;
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.*;
-import com.alibaba.graphscope.groot.common.exception.NodeConnectException;
+import com.alibaba.graphscope.groot.common.exception.NetworkFailureException;
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
@@ -120,7 +120,7 @@ private ManagedChannel createChannel(RoleType role, int idx) {
     public ManagedChannel getChannel(RoleType role, int idx) {
         Map<Integer, ManagedChannel> idToChannel = this.roleToChannels.get(role);
         if (idToChannel == null) {
-            throw new NodeConnectException("invalid role [" + role + "]");
+            throw new NetworkFailureException("invalid role [" + role + "]");
         }
         // to avoid thread competition
         if (idToChannel.get(idx) == null) {
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractAddTypePropertiesExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractAddTypePropertiesExecutor.java
index 9c23cf27f271..27993726ceb0 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractAddTypePropertiesExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractAddTypePropertiesExecutor.java
@@ -1,9 +1,9 @@
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.*;
 import com.alibaba.graphscope.groot.common.util.JSON;
 import com.alibaba.graphscope.groot.operation.Operation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.TypeDefPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractCreateTypeExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractCreateTypeExecutor.java
index a371392b87e3..20b7c22b1c42 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractCreateTypeExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractCreateTypeExecutor.java
@@ -13,13 +13,13 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.LabelId;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.TypeDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.TypeEnum;
 import com.alibaba.graphscope.groot.operation.Operation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.TypeDefPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDdlExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDdlExecutor.java
index b3fd7f8ac809..4976ac286cf7 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDdlExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDdlExecutor.java
@@ -13,9 +13,9 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.PropertyDef;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDropTypeExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDropTypeExecutor.java
index 709bb0c9492b..7e8f6e90314a 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDropTypeExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AbstractDropTypeExecutor.java
@@ -13,9 +13,9 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.*;
 import com.alibaba.graphscope.groot.operation.Operation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.TypeDefPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AddEdgeKindExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AddEdgeKindExecutor.java
index 948ef2d9d44c..8301a68f059a 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AddEdgeKindExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/AddEdgeKindExecutor.java
@@ -13,12 +13,12 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.EdgeKind;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.LabelId;
 import com.alibaba.graphscope.groot.operation.Operation;
 import com.alibaba.graphscope.groot.operation.ddl.AddEdgeKindOperation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.EdgeKindPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/CommitDataLoadExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/CommitDataLoadExecutor.java
index fab1b0c0f5b4..61af2acea91a 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/CommitDataLoadExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/CommitDataLoadExecutor.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.EdgeKind;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.LabelId;
@@ -21,7 +22,6 @@
 import com.alibaba.graphscope.groot.common.util.DataLoadTarget;
 import com.alibaba.graphscope.groot.operation.Operation;
 import com.alibaba.graphscope.groot.operation.ddl.CommitDataLoadOperation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.CommitDataLoadPb;
 import com.alibaba.graphscope.proto.groot.DataLoadTargetPb;
 import com.google.protobuf.ByteString;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/DdlExecutors.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/DdlExecutors.java
index 77d59c12bfe8..26d54c46142b 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/DdlExecutors.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/DdlExecutors.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.operation.Operation;
 import com.alibaba.graphscope.groot.operation.OperationType;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/PrepareDataLoadExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/PrepareDataLoadExecutor.java
index 069817b12302..a9c7c745d9b5 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/PrepareDataLoadExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/PrepareDataLoadExecutor.java
@@ -13,6 +13,7 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.EdgeKind;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.LabelId;
@@ -21,7 +22,6 @@
 import com.alibaba.graphscope.groot.common.util.DataLoadTarget;
 import com.alibaba.graphscope.groot.operation.Operation;
 import com.alibaba.graphscope.groot.operation.ddl.PrepareDataLoadOperation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.DataLoadTargetPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/RemoveEdgeKindExecutor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/RemoveEdgeKindExecutor.java
index c7b98257549f..e091b5c7b3db 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/RemoveEdgeKindExecutor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/schema/ddl/RemoveEdgeKindExecutor.java
@@ -13,12 +13,12 @@
  */
 package com.alibaba.graphscope.groot.schema.ddl;
 
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.EdgeKind;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.schema.wrapper.LabelId;
 import com.alibaba.graphscope.groot.operation.Operation;
 import com.alibaba.graphscope.groot.operation.ddl.RemoveEdgeKindOperation;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.proto.groot.EdgeKindPb;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/KafkaProcessor.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/KafkaProcessor.java
index 826f8ae3f020..8202e39f6a9f 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/KafkaProcessor.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/KafkaProcessor.java
@@ -5,7 +5,8 @@
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.CoordinatorConfig;
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.util.PartitionUtils;
 import com.alibaba.graphscope.groot.common.util.ThreadFactoryUtils;
 import com.alibaba.graphscope.groot.meta.FileMetaStore;
@@ -79,7 +80,7 @@ public void start() {
         try {
             recover();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
 
         this.persistOffsetsScheduler =
@@ -156,7 +157,7 @@ public void recover() throws IOException {
         if (recoveredOffset != -1) { // if -1, then assume it's a fresh store
             try (LogReader ignored = logService.createReader(storeId, recoveredOffset + 1)) {
             } catch (Exception e) {
-                throw new IOException(
+                throw new IllegalStateException(
                         "recovered queue [0] offset [" + recoveredOffset + "] is not available", e);
             }
         }
@@ -193,7 +194,7 @@ public void pollBatches() {
         try {
             replayWAL();
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new InternalException(e);
         }
         // -1 stands for poll from latest
         try (LogReader reader = logService.createReader(storeId, -1)) {
@@ -204,7 +205,7 @@ public void pollBatches() {
                 }
             }
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new InternalException(e);
         }
     }
 
@@ -246,7 +247,7 @@ private void processRecord(ConsumerRecord<LogEntry, LogEntry> record) {
         try {
             writerAgent.writeStore(builder.build());
         } catch (InterruptedException e) {
-            throw new RuntimeException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/SnapshotSortQueue.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/SnapshotSortQueue.java
index bb3a48961f38..cb86eaf5ec11 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/SnapshotSortQueue.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/SnapshotSortQueue.java
@@ -15,6 +15,7 @@
 
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.meta.MetaService;
 import com.alibaba.graphscope.groot.operation.StoreDataBatch;
 
@@ -65,7 +66,7 @@ public SnapshotSortQueue(Configs configs, MetaService metaService) {
     public boolean offerQueue(int queueId, StoreDataBatch entry) throws InterruptedException {
         BlockingQueue<StoreDataBatch> innerQueue = this.innerQueues.get(queueId);
         if (innerQueue == null) {
-            throw new IllegalArgumentException("invalid queueId [" + queueId + "]");
+            throw new InvalidArgumentException("invalid queueId [" + queueId + "]");
         }
         boolean res = innerQueue.offer(entry, this.queueWaitMs, TimeUnit.MILLISECONDS);
         if (res) {
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/StoreService.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/StoreService.java
index 42e8341f925b..1afa69a48fa8 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/StoreService.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/StoreService.java
@@ -18,6 +18,8 @@
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
 import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.IllegalStateException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.util.ThreadFactoryUtils;
 import com.alibaba.graphscope.groot.common.util.Utils;
 import com.alibaba.graphscope.groot.meta.MetaService;
@@ -101,7 +103,7 @@ public void start() throws IOException {
                 GraphPartition partition = makeGraphPartition(this.storeConfigs, partitionId);
                 this.idToPartition.put(partitionId, partition);
             } catch (IOException e) {
-                throw new GrootException(e);
+                throw new InternalException(e);
             }
         }
         initMetrics();
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/ExternalStorage.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/ExternalStorage.java
index 8ee588dbb970..a5ab2db00114 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/ExternalStorage.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/ExternalStorage.java
@@ -1,5 +1,7 @@
 package com.alibaba.graphscope.groot.store.external;
 
+import com.alibaba.graphscope.groot.common.exception.*;
+
 import org.apache.commons.codec.binary.Hex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +36,7 @@ public static ExternalStorage getStorage(String path, Map<String, String> config
             case "volume":
                 return new VolumeStorage(path, config);
             default:
-                throw new IllegalArgumentException(
+                throw new InvalidArgumentException(
                         "external storage scheme [" + scheme + "] not supported");
         }
     }
@@ -60,7 +62,7 @@ public void downloadDataWithMove(String srcPath, String dstPath) throws IOExcept
         Files.move(Path.of(tmpPath), Path.of(dstPath), StandardCopyOption.REPLACE_EXISTING);
     }
 
-    public void downloadDataWithRetry(String srcPath, String dstPath) throws IOException {
+    public void downloadDataWithRetry(String srcPath, String dstPath) {
         int maxRetry = 5;
         for (int i = 0; i < maxRetry; ++i) {
             try {
@@ -68,7 +70,7 @@ public void downloadDataWithRetry(String srcPath, String dstPath) throws IOExcep
                 break;
             } catch (IOException e) {
                 if (i == maxRetry - 1) {
-                    throw e;
+                    throw new ExternalStorageErrorException(e);
                 } else {
                     logger.error("Failed to download " + srcPath + ", retrying...", e);
                 }
@@ -89,7 +91,7 @@ public void downloadData(String srcPath, String dstPath) throws IOException {
             fis.read(chkData);
             fis.close();
         } catch (FileNotFoundException e) {
-            throw new IOException(e);
+            throw new NotFoundException(e);
         }
         String[] chkArray = new String(chkData).split(",");
         if ("0".equals(chkArray[0])) {
@@ -97,7 +99,7 @@ public void downloadData(String srcPath, String dstPath) throws IOException {
             return;
         }
         if (chkArray.length != 2) {
-            throw new IOException(
+            throw new InvalidDataException(
                     "Checksum format error: content: [" + chkArray + "]; path: " + chkPath);
         }
         String chkMD5Value = chkArray[1];
@@ -106,7 +108,7 @@ public void downloadData(String srcPath, String dstPath) throws IOException {
         if (!chkMD5Value.equals(sstMD5Value)) {
             logger.error("Checksum failed for " + chkLocalPath + " versus " + dstPath);
             logger.error("Expect [" + chkMD5Value + "], got [" + sstMD5Value + "]");
-            throw new IOException("CheckSum failed for " + srcPath);
+            throw new InvalidDataException("CheckSum failed for " + srcPath);
         } else {
             // The .chk file are now useless
             chkFile.delete();
@@ -125,9 +127,9 @@ public String getFileMD5(String fileName) throws IOException {
             }
             return new String(Hex.encodeHex(MD5.digest()));
         } catch (NoSuchAlgorithmException e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         } catch (IOException e) {
-            throw e;
+            throw new InvalidArgumentException(e);
         } finally {
             if (fis != null) {
                 fis.close();
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/VolumeStorage.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/VolumeStorage.java
index 4357ae442955..b32f90e7651f 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/VolumeStorage.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/external/VolumeStorage.java
@@ -1,6 +1,7 @@
 package com.alibaba.graphscope.groot.store.external;
 
 import com.alibaba.graphscope.groot.common.config.DataLoadConfig;
+import com.alibaba.graphscope.groot.common.exception.ExternalStorageErrorException;
 import com.aliyun.odps.Odps;
 import com.aliyun.odps.account.AliyunAccount;
 import com.aliyun.odps.tunnel.TunnelException;
@@ -56,7 +57,7 @@ public void downloadDataSimple(String srcPath, String dstPath) throws IOExceptio
                 }
             }
         } catch (TunnelException e) {
-            throw new IOException(e);
+            throw new ExternalStorageErrorException(e);
         }
         long finish = System.currentTimeMillis();
         long timeElapsed = finish - start;
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphBackupEngine.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphBackupEngine.java
index 8dbf733598a2..9f769c65e55b 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphBackupEngine.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphBackupEngine.java
@@ -13,6 +13,8 @@
  */
 package com.alibaba.graphscope.groot.store.jna;
 
+import com.alibaba.graphscope.groot.common.exception.ExternalStorageErrorException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.store.backup.GraphPartitionBackup;
 import com.sun.jna.Pointer;
 
@@ -53,7 +55,7 @@ public int createNewPartitionBackup() throws IOException {
             }
             byte[] data = jnaResponse.getData();
             if (data == null || data.length != Integer.BYTES) {
-                throw new IOException(
+                throw new ExternalStorageErrorException(
                         "fail to get new created backup id from jna response, partition ["
                                 + this.partitionId
                                 + "]");
@@ -69,14 +71,14 @@ public int createNewPartitionBackup() throws IOException {
     public void restoreFromPartitionBackup(int partitionBackupId, String PartitionRestorePath)
             throws IOException {
         if (PartitionRestorePath.equals(this.backupPath)) {
-            throw new IOException("restore path cannot be same with backup path");
+            throw new InvalidArgumentException("restore path cannot be same with backup path");
         }
         try (JnaResponse jnaResponse =
                 GraphLibrary.INSTANCE.restoreFromBackup(
                         this.bePointer, PartitionRestorePath, partitionBackupId)) {
             if (!jnaResponse.success()) {
                 String errMsg = jnaResponse.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
         }
     }
@@ -87,7 +89,7 @@ public void verifyPartitionBackup(int partitionBackupId) throws IOException {
                 GraphLibrary.INSTANCE.verifyBackup(this.bePointer, partitionBackupId)) {
             if (!jnaResponse.success()) {
                 String errMsg = jnaResponse.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
         }
     }
@@ -100,7 +102,7 @@ public void partitionBackupGc(List<Integer> readyPartitionBackupIds) throws IOEx
         try (JnaResponse jnaResponse = GraphLibrary.INSTANCE.getBackupList(this.bePointer)) {
             if (!jnaResponse.success()) {
                 String errMsg = jnaResponse.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
             byte[] data = jnaResponse.getData();
             if (data == null) {
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphStore.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphStore.java
index 35c173d32bc5..554c0c0e1998 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphStore.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/store/jna/JnaGraphStore.java
@@ -16,6 +16,7 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
+import com.alibaba.graphscope.groot.common.exception.ExternalStorageErrorException;
 import com.alibaba.graphscope.groot.operation.OperationBatch;
 import com.alibaba.graphscope.groot.store.GraphPartition;
 import com.alibaba.graphscope.groot.store.backup.GraphPartitionBackup;
@@ -103,7 +104,7 @@ public boolean writeBatch(long snapshotId, OperationBatch operationBatch) throws
                         this.pointer, snapshotId, dataBytes, dataBytes.length)) {
             if (!response.success()) {
                 String errMsg = response.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
             return response.hasDdl();
         }
@@ -114,7 +115,7 @@ public GraphDefPb getGraphDefBlob() throws IOException {
         try (JnaResponse jnaResponse = GraphLibrary.INSTANCE.getGraphDefBlob(this.pointer)) {
             if (!jnaResponse.success()) {
                 String errMsg = jnaResponse.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
             return GraphDefPb.parseFrom(jnaResponse.getData());
         }
@@ -125,7 +126,7 @@ public Statistics getGraphStatisticsBlob(long si) throws IOException {
         try (JnaResponse jnaResponse = GraphLibrary.INSTANCE.getGraphStatistics(this.pointer, si)) {
             if (!jnaResponse.success()) {
                 String errMsg = jnaResponse.getErrMsg();
-                throw new IOException(errMsg);
+                throw new ExternalStorageErrorException(errMsg);
             }
             return Statistics.parseFrom(jnaResponse.getData());
         }
@@ -156,7 +157,7 @@ public void garbageCollect(long snapshotId) throws IOException {
         try (JnaResponse response =
                 GraphLibrary.INSTANCE.garbageCollectSnapshot(this.pointer, snapshotId)) {
             if (!response.success()) {
-                throw new IOException(response.getErrMsg());
+                throw new ExternalStorageErrorException(response.getErrMsg());
             }
         }
     }
@@ -166,7 +167,7 @@ public void tryCatchUpWithPrimary() throws IOException {
         ensurePointer();
         try (JnaResponse response = GraphLibrary.INSTANCE.tryCatchUpWithPrimary(this.pointer)) {
             if (!response.success()) {
-                throw new IOException(response.getErrMsg());
+                throw new ExternalStorageErrorException(response.getErrMsg());
             }
         }
     }
@@ -176,7 +177,7 @@ public void reopenSecondary(long wait_sec) throws IOException {
         ensurePointer();
         try (JnaResponse response = GraphLibrary.INSTANCE.reopenSecondary(this.pointer, wait_sec)) {
             if (!response.success()) {
-                throw new IOException(response.getErrMsg());
+                throw new ExternalStorageErrorException(response.getErrMsg());
             }
         }
     }
@@ -186,14 +187,14 @@ public void compact() throws IOException {
         ensurePointer();
         try (JnaResponse response = GraphLibrary.INSTANCE.compact(this.pointer)) {
             if (!response.success()) {
-                throw new IOException(response.getErrMsg());
+                throw new ExternalStorageErrorException(response.getErrMsg());
             }
         }
     }
 
     private void ensurePointer() throws IOException {
         if (this.pointer == null) {
-            throw new IOException("JNA pointer is null");
+            throw new ExternalStorageErrorException("JNA pointer is null");
         }
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogReader.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogReader.java
index ac8b3dcf04c5..a0381a31759d 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogReader.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogReader.java
@@ -15,6 +15,8 @@
  */
 package com.alibaba.graphscope.groot.wal.kafka;
 
+import com.alibaba.graphscope.groot.common.exception.InternalException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 import com.alibaba.graphscope.groot.wal.LogEntry;
 import com.alibaba.graphscope.groot.wal.LogReader;
 import com.alibaba.graphscope.groot.wal.ReadLogEntry;
@@ -63,7 +65,7 @@ public KafkaLogReader(
             offset = getOffset(client, partition, OffsetSpec.forTimestamp(timestamp));
         }
         if (earliest > offset || offset > latest) {
-            throw new IllegalArgumentException(
+            throw new InvalidArgumentException(
                     "invalid offset " + offset + ", hint: [" + earliest + ", " + latest + ")");
         }
         consumer = new KafkaConsumer<>(kafkaConfigs, deSer, deSer);
@@ -78,15 +80,14 @@ public KafkaLogReader(
                 latest);
     }
 
-    private long getOffset(AdminClient client, TopicPartition partition, OffsetSpec spec)
-            throws IOException {
+    private long getOffset(AdminClient client, TopicPartition partition, OffsetSpec spec) {
         try {
             return client.listOffsets(Collections.singletonMap(partition, spec))
                     .partitionResult(partition)
                     .get()
                     .offset();
         } catch (InterruptedException | ExecutionException e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogService.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogService.java
index 2679ebbe626c..fe057d787b15 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogService.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogService.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.KafkaConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.wal.LogReader;
 import com.alibaba.graphscope.groot.wal.LogService;
 import com.alibaba.graphscope.groot.wal.LogWriter;
@@ -68,7 +68,7 @@ public void init() {
         try {
             admin.createTopics(Collections.singleton(newTopic)).all().get();
         } catch (InterruptedException | ExecutionException e) {
-            throw new GrootException("create topics [" + this.topic + "] failed", e);
+            throw new InternalException("create topics [" + this.topic + "] failed", e);
         }
     }
 
@@ -78,7 +78,7 @@ public void destroy() {
         try {
             admin.deleteTopics(Arrays.asList(topic)).all().get();
         } catch (InterruptedException | ExecutionException e) {
-            throw new GrootException("delete topics [" + this.topic + "] failed", e);
+            throw new InternalException("delete topics [" + this.topic + "] failed", e);
         }
     }
 
@@ -88,7 +88,7 @@ public boolean initialized() {
         try {
             return admin.listTopics().names().get().contains(this.topic);
         } catch (InterruptedException | ExecutionException e) {
-            throw new GrootException("list topics failed", e);
+            throw new InternalException("list topics failed", e);
         }
     }
 
@@ -134,7 +134,7 @@ public void deleteBeforeOffset(int queueId, long offset) throws IOException {
         try {
             result.all().get();
         } catch (InterruptedException | ExecutionException e) {
-            throw new IOException(e);
+            throw new InternalException(e);
         }
     }
 
@@ -166,6 +166,6 @@ private AdminClient createAdminWithRetry() throws InterruptedException {
                 Thread.sleep(10000);
             }
         }
-        throw new RuntimeException("Create Kafka Client failed");
+        throw new InternalException("Create Kafka Client failed");
     }
 }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogWriter.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogWriter.java
index 94666f87c898..979dc3e19e8d 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogWriter.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/KafkaLogWriter.java
@@ -15,7 +15,7 @@
  */
 package com.alibaba.graphscope.groot.wal.kafka;
 
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.wal.LogEntry;
 import com.alibaba.graphscope.groot.wal.LogWriter;
 
@@ -78,7 +78,7 @@ public long waitFuture(Future<RecordMetadata> future) {
             recordMetadata = future.get();
         } catch (InterruptedException | ExecutionException e) {
             logger.error("append kafka failed", e);
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         return recordMetadata.offset();
     }
diff --git a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/LogEntryDeserializer.java b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/LogEntryDeserializer.java
index 4b0d714e1e08..e337b594cc16 100644
--- a/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/LogEntryDeserializer.java
+++ b/interactive_engine/groot-module/src/main/java/com/alibaba/graphscope/groot/wal/kafka/LogEntryDeserializer.java
@@ -15,7 +15,7 @@
  */
 package com.alibaba.graphscope.groot.wal.kafka;
 
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.wal.LogEntry;
 import com.alibaba.graphscope.proto.groot.LogEntryPb;
 import com.google.protobuf.InvalidProtocolBufferException;
@@ -36,7 +36,7 @@ public LogEntry deserialize(String topic, byte[] data) {
         try {
             return LogEntry.parseProto(LogEntryPb.parseFrom(data));
         } catch (InvalidProtocolBufferException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Coordinator.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Coordinator.java
index 0c9ee6b9d47c..4f2cdad2a345 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Coordinator.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Coordinator.java
@@ -18,7 +18,7 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.CoordinatorConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.coordinator.*;
 import com.alibaba.graphscope.groot.coordinator.IngestorWriteClient;
 import com.alibaba.graphscope.groot.coordinator.backup.BackupManager;
@@ -162,7 +162,7 @@ public void start() {
         try {
             this.rpcServer.start();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         this.discovery.start();
         this.channelManager.start();
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Frontend.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Frontend.java
index be77141b1fac..bfaf456df732 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Frontend.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Frontend.java
@@ -18,7 +18,7 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.FrontendConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.util.RpcUtils;
 import com.alibaba.graphscope.groot.discovery.FileDiscovery;
 import com.alibaba.graphscope.groot.discovery.LocalNodeProvider;
@@ -169,7 +169,7 @@ public void start() {
         try {
             this.rpcServer.start();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         this.discovery.start();
         this.channelManager.start();
@@ -179,14 +179,14 @@ public void start() {
                 Thread.sleep(1000);
                 logger.info("Waiting for schema ready...");
             } catch (InterruptedException e) {
-                throw new GrootException(e);
+                throw new InternalException(e);
             }
         }
         this.graphService.start();
         try {
             this.serviceServer.start();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/GrootGraph.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/GrootGraph.java
index 516ebd4b0331..08e9939e5371 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/GrootGraph.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/GrootGraph.java
@@ -18,7 +18,8 @@
 import com.alibaba.graphscope.groot.Utils;
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.*;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 
 import io.opentelemetry.api.OpenTelemetry;
 
@@ -42,7 +43,7 @@ public static void main(String[] args) throws Exception {
             try {
                 node = new MaxNode(conf);
             } catch (Exception e) {
-                throw new GrootException(e);
+                throw new InternalException(e);
             }
         } else {
             String roleName = args[0];
@@ -58,7 +59,7 @@ public static void main(String[] args) throws Exception {
                     node = new Coordinator(conf);
                     break;
                 default:
-                    throw new IllegalArgumentException("invalid roleType [" + roleType + "]");
+                    throw new InvalidArgumentException("invalid roleType [" + roleType + "]");
             }
 
             boolean writeHAEnabled = CommonConfig.WRITE_HA_ENABLED.get(conf);
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/MaxNode.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/MaxNode.java
index 02d9fbd05f6f..8d635aab1eab 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/MaxNode.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/MaxNode.java
@@ -15,7 +15,7 @@
 
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.*;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.google.common.annotations.VisibleForTesting;
 import com.salesforce.kafka.test.KafkaTestCluster;
 
@@ -113,7 +113,7 @@ public void start() {
             try {
                 startThread.join();
             } catch (InterruptedException e) {
-                throw new GrootException(e);
+                throw new InternalException(e);
             }
         }
         logger.info("MaxNode started");
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/NodeLauncher.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/NodeLauncher.java
index 479452baafa6..18f26d405f2d 100755
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/NodeLauncher.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/NodeLauncher.java
@@ -13,7 +13,7 @@
  */
 package com.alibaba.graphscope.groot.servers;
 
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -59,7 +59,7 @@ public void start() {
             this.node.start();
         } catch (Exception e) {
             logger.error("start node failed", e);
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         this.keepAliveThread.start();
     }
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Store.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Store.java
index 4a6e5b52e46d..ae86914a8aac 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Store.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/Store.java
@@ -15,7 +15,7 @@
 
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.discovery.*;
 import com.alibaba.graphscope.groot.meta.DefaultMetaService;
 import com.alibaba.graphscope.groot.meta.MetaService;
@@ -91,14 +91,14 @@ public void start() {
         try {
             this.storeService.start();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         this.writerAgent.start();
         this.backupAgent.start();
         try {
             this.rpcServer.start();
         } catch (IOException e) {
-            throw new GrootException(e);
+            throw new InternalException(e);
         }
         this.discovery.start();
         this.channelManager.start();
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/FrontendQueryManager.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/FrontendQueryManager.java
index 0330544d8c39..59d42c54d46e 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/FrontendQueryManager.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/FrontendQueryManager.java
@@ -19,6 +19,7 @@
 import com.alibaba.graphscope.common.ir.meta.IrMeta;
 import com.alibaba.graphscope.common.ir.meta.fetcher.IrMetaFetcher;
 import com.alibaba.graphscope.common.manager.IrMetaQueryCallback;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.frontend.SnapshotUpdateClient;
 import com.alibaba.graphscope.groot.rpc.RoleClients;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
@@ -87,7 +88,7 @@ public synchronized IrMeta beforeExec() {
             queryQueue.put(status);
             return irMeta;
         } catch (InterruptedException e) {
-            throw new RuntimeException(e);
+            throw new InternalException(e);
         }
     }
 
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/GaiaEngine.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/GaiaEngine.java
index db765295cbd0..e7043655e697 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/GaiaEngine.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/GaiaEngine.java
@@ -19,7 +19,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.GaiaInternalException;
 import com.alibaba.graphscope.groot.discovery.*;
 import com.alibaba.graphscope.groot.servers.jna.GaiaLibrary;
 import com.alibaba.graphscope.groot.servers.jna.GaiaPortsResponse;
@@ -82,7 +82,7 @@ public void updatePartitionRouting(int partitionId, int serverId) {
     public void start() {
         try (GaiaPortsResponse gaiaPortsResponse = GaiaLibrary.INSTANCE.startEngine(this.pointer)) {
             if (!gaiaPortsResponse.success) {
-                throw new GrootException(gaiaPortsResponse.errMsg);
+                throw new GaiaInternalException(gaiaPortsResponse.errMsg);
             }
             engineNodeProvider.apply(gaiaPortsResponse.enginePort);
             rpcNodeProvider.apply(gaiaPortsResponse.rpcPort);
diff --git a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/IrServiceProducer.java b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/IrServiceProducer.java
index 61f5835bf556..a8a3da0de562 100644
--- a/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/IrServiceProducer.java
+++ b/interactive_engine/groot-server/src/main/java/com/alibaba/graphscope/groot/servers/ir/IrServiceProducer.java
@@ -26,6 +26,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
+import com.alibaba.graphscope.groot.common.exception.InternalException;
 import com.alibaba.graphscope.groot.common.schema.api.SchemaFetcher;
 import com.alibaba.graphscope.groot.discovery.DiscoveryFactory;
 import com.alibaba.graphscope.groot.frontend.SnapshotUpdateClient;
@@ -83,7 +84,7 @@ public void start() {
                     this.graphServer.start();
                     queryManager.start();
                 } catch (Exception e) {
-                    throw new RuntimeException(e);
+                    throw new InternalException(e);
                 }
             }
 
@@ -93,7 +94,7 @@ public void stop() {
                     this.graphServer.close(); // graphServer is always not null
                     queryManager.stop();
                 } catch (Exception e) {
-                    throw new RuntimeException(e);
+                    throw new InternalException(e);
                 }
             }
         };
diff --git a/proto/error/analytical.proto b/proto/error/analytical.proto
new file mode 100644
index 000000000000..7e751b83b6d1
--- /dev/null
+++ b/proto/error/analytical.proto
@@ -0,0 +1,80 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+package gs.rpc;
+
+// component-02: Analytical Engine
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+
+    // kOk = 0;
+    // kIOError = 100;
+    IO_ERROR = 100;
+    // kArrowError = 101;
+    ARROW_ERROR = 101;
+    // kVineyardError = 102;
+    VINEYARD_ERROR = 102;
+    // kUnspecificError = 103;
+    UNSPECIFIC_ERROR = 103;
+    // kDistributedError = 104;
+    DISTRIBUTED_ERROR = 104;
+    // kNetworkError = 105;
+    // kCommandError = 105;
+    COMMAND_ERROR = 105;
+    // kDataTypeError = 106;
+    DATA_TYPE_ERROR = 106;
+    // kIllegalStateError = 108;
+    // kInvalidValueError = 109;
+    // kInvalidOperationError = 107;
+    INVALID_OPERATION = 107;
+    // kUnsupportedOperationError = 111;
+    // kUnimplementedMethod = 112;
+    // kGraphArError = 108;
+    GRAPHAR_ERROR = 108;
+}
diff --git a/proto/error/coordinator.proto b/proto/error/coordinator.proto
new file mode 100644
index 000000000000..8bf58db11a44
--- /dev/null
+++ b/proto/error/coordinator.proto
@@ -0,0 +1,98 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+package gs.rpc;
+
+// component-01: Coordinator
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+
+    // Connection error with client.
+    // e.g. multiple client connect to coordinator at the same time or
+    // failed to launch engine locally.
+    CONNECTION_ERROR = 100;
+  
+    // Error raised by vineyard.
+    VINEYARD_ERROR = 101;
+  
+    // Error raised when running UDF application
+    UDF_INTERNAL_ERROR = 102;
+  
+    // Error reported  by the k8s cluster
+    K8S_ERROR = 103;
+  
+    // Error raised when executing gremlin query
+    GREMLIN_QUERY_ERROR = 104;
+  
+    // Retry time exceed the defined maximum threshold
+    RETRIES_EXCEEDED_ERROR = 105;
+  
+    // Errors raised by analytical engine
+    ANALYTICAL_ENGINE_INTERNAL_ERROR = 106;
+  
+    // Errors raised by interactive engine
+    INTERACTIVE_ENGINE_INTERNAL_ERROR = 107;
+  
+    // Errors raised by learning engine
+    LEARNING_ENGINE_INTERNAL_ERROR = 108;
+  
+    // Errors raised by coordinator
+    COORDINATOR_INTERNAL_ERROR = 109;
+  
+    // Errors raised by analytical engine
+    // Results of workers not consistent 
+    WORKER_RESULTS_INCONSISTENT_ERROR = 110;
+  
+    // Unknown error.
+    UNKNOWN_ERROR = 111;
+  
+    // Fatal error.
+    // Means the service is not recoverable.
+    // e.g. engine socket closed in grpc connection. Usually means engine has crashed.
+    FATAL_ERROR = 112;
+}
diff --git a/proto/error/error.proto b/proto/error/error.proto
new file mode 100644
index 000000000000..0e3a84b4b683
--- /dev/null
+++ b/proto/error/error.proto
@@ -0,0 +1,36 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+package gs.rpc;
+
+option java_package = "com.alibaba.graphscope.proto";
+option java_multiple_files = true;
+
+message Status {
+    int32 code = 1;
+    string message = 2;
+}
diff --git a/proto/error/frontend.proto b/proto/error/frontend.proto
new file mode 100644
index 000000000000..474c4d9584cf
--- /dev/null
+++ b/proto/error/frontend.proto
@@ -0,0 +1,95 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+option java_package = "com.alibaba.graphscope.proto";
+option java_multiple_files = true;
+
+// component-03: GIE Frontend
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+
+    // invalid gremlin syntax thrown by antlr4
+    // GremlinSyntaxParseError = 100;
+    GREMLIN_INVALID_SYNTAX = 100;
+    // invalid cypher syntax thrown by antlr4
+    // CypherSyntaxParseError = 101;
+    CYPHER_INVALID_SYNTAX = 101;
+    // query given label is not found in schema
+    // LabelNotFoundError = 102;
+    LABEL_NOT_FOUND = 102;
+    // query given property name is not found in schema
+    // PropertyNotFoundError = 103;
+    PROPERTY_NOT_FOUND = 103;
+    // tag not exist in current query contex
+    // TagNotFoundError = 104;
+    TAG_NOT_FOUND = 104;
+    // targets two types of errors:
+    // 1. invalid algebraic type, such as "cannot apply + to string arguments"
+    // 2. invalid graph patterns based on the given schema
+    // TypeInferenceError = 105;
+    TYPE_INFERENCE_FAILED = 105;
+    // error thrown in logical plan optimization
+    // LogicalPlanBuildError = 106;
+    LOGICAL_PLAN_BUILD_FAILED = 106;
+    // error thrown in physical plan build
+    // PhysicalPlanBuildError = 107;
+    PHYSICAL_PLAN_BUILD_FAILED = 107;
+    // error thrown when parsing gremlin results
+    // GremlinResultParseError = 108;
+    GREMLIN_INVALID_RESULT = 108;
+    // error thrown then parsing cypher results
+    // CypherResultParseError = 109;
+    CYPHER_INVALID_RESULT = 109;
+    // engine is not available to process the query, e.g. engine is down
+    // EngineUnavailableError = 110;
+    ENGINE_UNAVAILABLE = 110;
+    // query execution time exceeds the limit
+    // QueryExecutionTimeoutError = 111;
+    QUERY_EXECUTION_TIMEOUT = 111;
+}
diff --git a/proto/error/insight.proto b/proto/error/insight.proto
new file mode 100644
index 000000000000..8bb83c7360d9
--- /dev/null
+++ b/proto/error/insight.proto
@@ -0,0 +1,123 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+option java_package = "com.alibaba.graphscope.proto";
+option java_multiple_files = true;
+
+// component-04: GIE Insight Server (vineyard + groot)
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+
+    // try to get a property in ValueType1, but the it's real type is ValueType2 and it's not ValueType1 and
+    // compatible to ValueType1
+    // ValueTypeMismatch = 100;
+    VALUE_TYPE_MISMATCH = 100;
+    // get lock failed
+    // LockFailed = 101;
+    LOCK_FAILED = 101;
+    // too many data of old versions in graph store, maybe something error with garbage collection
+    // usuage trigger when modifing the schema
+    // TooManyVersions = 102;
+    TOO_MANY_VERSIONS = 102;
+    // some fatal bug in graph store
+    // GraphStoreBug = 103;
+    BACKUP_FAILED = 103;
+    // user's operation is invalid, like: create a type that already exists
+    // InvalidOperation = 104;
+    INVALID_OPERATION = 104;
+    // when try to insert data, the type exists in storage but isn't visible at that moment
+    // DataNotExists = 105;
+    DATA_NOT_EXISTS = 105;
+    // error in external storage like rocksdb
+    // ExternalStorageError = 106;
+    EXTERNAL_STORAGE_ERROR = 106;
+    // decode property from bytes failed, maybe caused by corrupted binary data in storage,
+    // or by using the wrong decoder, 
+    // DecodeError = 107;
+    INVALID_DATA = 107;
+    // operations or features is not supported, e.g. delete from a secondary instance
+    // NotSupported = 108;
+
+    // PropertyAlreadyExist = 109;
+    TYPE_NOT_FOUND = 108;
+    PROPERTY_NOT_FOUND = 109;
+    // TypeAlreadyExist = 111;
+    // RelationShipAlreadyExist = 113;
+    // RelationShipNotExist = 114;
+
+    // client-frontend related
+    // RealtimeWriteFailed = 110;
+    REALTIME_WRITE_FAILED = 110;
+    // ServiceNotReady = 111;
+    SERVICE_NOT_READY = 111;
+    // QueueReject = 112;
+    QUEUE_REJECT = 112;
+
+    // query related
+    // QueryFailed = 113;
+    QUERY_FAILED = 113;
+    // QueryCancelled = 114;
+    // QUERY_CANCELLED = 114;
+
+    // IllegalSchema = 115;
+    ILLEGAL_SCHEMA = 115;
+
+    // e.g. delete property
+    // UnSupportedMetaOperation = 115;
+    // e.g. list, map, set
+    // DataTypeNotValid = 109;
+    INVALID_DATA_TYPE = 116;
+
+    INTERNAL = 117;
+
+    GAIA_INTERNAL_ERROR = 118;
+
+    DDL_ERROR = 119;
+
+}
diff --git a/proto/error/interactive.proto b/proto/error/interactive.proto
new file mode 100644
index 000000000000..99938352601b
--- /dev/null
+++ b/proto/error/interactive.proto
@@ -0,0 +1,90 @@
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+package gs.rpc.interactive;
+
+
+// component-05: GIE Interactive Server (flex)
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+
+    // InValidArgument = 100;
+    // UnsupportedOperator = 101;
+    // AlreadyExists = 102;
+    // NotExists = 103;
+    // CodegenError = 100;
+    CODEGEN_ERROR = 100;
+    // UninitializedStatus = 101;
+
+    // InvalidSchema = 101;
+    INVALID_SCHEMA = 101;
+    // PermissionError = 107;
+    // IllegalOperation = 102;
+    ILLEGAL_OPERATION = 102;
+    // InternalError = 103;
+    INTERNAL_ERROR = 103;
+    // InvalidImportFile = 104;
+    INVALID_IMPORT_FILE = 104;
+    // IOError = 105;
+    IO_ERROR = 105;
+    // NotFound = 112;
+    // QueryFailed = 106;
+    QUERY_FAILED = 106;
+    // ReopenError = 107;
+    REOPEN_ERROR = 107;
+    // ErrorOpenMeta = 108;
+    ERROR_OPEN_META = 108;
+    // SQlExecutionError = 109;
+    SQL_EXECUTION_ERROR = 109;
+    // SqlBindingError = 110;
+    SQL_BINDING_ERROR = 110;
+    // Unimplemented = 118;
+    // AlreadyLocked = 111;
+    ALREADY_LOCKED = 111;
+}
diff --git a/proto/error/learning.proto b/proto/error/learning.proto
new file mode 100644
index 000000000000..efe6916ce25d
--- /dev/null
+++ b/proto/error/learning.proto
@@ -0,0 +1,56 @@
+
+/**
+ *
+ * The file proto/attr_value.proto is referred and derived from project
+ * tensorflow,
+ *
+ *    https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/framework/attr_value.proto
+ *
+ * which has the following license:
+ *
+ *
+ Copyright 2015 The TensorFlow Authors. All Rights Reserved.
+
+ Licensed 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.
+ ==============================================================================
+ */
+syntax = "proto3";
+
+package gs.rpc.learning;
+
+// component-06: Learning Engine
+enum Code {
+    // Not an error; returned on success.
+    OK = 0;
+    CANCELLED = 1;
+    // Arguments of operations is invalid / in a wrong format.
+    INVALID_ARGUMENT = 2;
+    // Timeout, used when an operation fail to return result in an specific time.
+    TIMEOUT = 3;
+    // Required resources cannot be found.
+    NOT_FOUND = 4;
+    // File or resources already existed.
+    ALREADY_EXISTS = 5;
+    RESOURCE_EXHAUSTED = 6;
+    // Functionality not implemented yet
+    UNIMPLEMENTED = 7;
+    // Client doesn't have the permission.
+    PERMISSION_DENIED = 8;
+    // Compile graph frame or app frame failed.
+    COMPILATION_FAILURE = 9;
+    PORT_IN_USE = 10;
+    UNSUPPORTED_OPERATION = 11;
+    ILLEGAL_STATE = 12;
+    // Network is unreachable
+    NETWORK_FAILURE = 13;
+}
diff --git a/proto/error_codes.proto b/proto/error_codes.proto
deleted file mode 100644
index c2e582dce8a2..000000000000
--- a/proto/error_codes.proto
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2020 Alibaba Group Holding Limited. All Rights Reserved.
-//
-// Licensed 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.
-//
-
-syntax = "proto3";
-
-package gs.rpc;
-
-enum Code {
-  // Not an error; returned on success.
-  OK = 0;
-
-  // Timeout, used when an operation fail to return result in an specific time.
-  TIMEOUT_ERROR = 1;
-
-  // Required resources cannot be found.
-  NOT_FOUND_ERROR = 2;
-
-  // Connection error with client.
-  // e.g. multiple client connect to coordinator at the same time or
-  // failed to launch engine locally.
-  CONNECTION_ERROR = 3;
-
-  // Error raised by vineyard.
-  VINEYARD_ERROR = 4;
-
-  // Compile graph frame or app frame failed.
-  COMPILATION_ERROR = 5;
-
-  // File or resources already existed.
-  ALREADY_EXISTS_ERROR = 6;
-
-  // Error raised when running UDF application
-  UDF_INTERNAL_ERROR = 7;
-
-  // Resources temporary unavaiable.
-  UNAVAILABLE_ERROR = 8;
-
-  // Arguments of operations is invalid / in a wrong format.
-  INVALID_ARGUMENT_ERROR = 9;
-
-  // Client doesn't have the permission.
-  PERMISSION_DENIED_ERROR = 10;
-
-  // Network is unreachable
-  NETWORK_ERROR = 11;
-
-  // Error reported  by the k8s cluster
-  K8S_ERROR = 12;
-
-  // Functionality not implemented yet
-  UNIMPLEMENTED_ERROR = 13;
-
-  // Error raised when executing gremlin query
-  GREMLIN_QUERY_ERROR = 14;
-
-  // Retry time exceed the defined maximum threshold
-  RETRIES_EXCEEDED_ERROR = 15;
-
-  // Errors raised by analytical engine
-  ANALYTICAL_ENGINE_INTERNAL_ERROR = 30;
-
-  // Errors raised by interactive engine
-  INTERACTIVE_ENGINE_INTERNAL_ERROR = 31;
-
-  // Errors raised by learning engine
-  LEARNING_ENGINE_INTERNAL_ERROR = 32;
-
-  // Errors raised by coordinator
-  COORDINATOR_INTERNAL_ERROR = 33;
-
-  // Errors raised by analytical engine
-  // Results of workers not consistent 
-  WORKER_RESULTS_INCONSISTENT_ERROR = 41;
-
-  // Unknown error.
-  UNKNOWN_ERROR = 101;
-
-  // Fatal error.
-  // Means the service is not recoverable.
-  // e.g. engine socket closed in grpc connection. Usually means engine has crashed.
-  FATAL_ERROR = 102;
-}
diff --git a/proto/message.proto b/proto/message.proto
index 2a7bbf6ab54b..bf14f92902dd 100644
--- a/proto/message.proto
+++ b/proto/message.proto
@@ -17,7 +17,7 @@ syntax = "proto3";
 
 package gs.rpc;
 
-import "error_codes.proto";
+import "error/coordinator.proto";
 import "op_def.proto";
 import "types.proto";
 
diff --git a/proto/op_def.proto b/proto/op_def.proto
index 1cd9c6b98d8b..1fc825461507 100644
--- a/proto/op_def.proto
+++ b/proto/op_def.proto
@@ -18,7 +18,7 @@ syntax = "proto3";
 package gs.rpc;
 
 import "attr_value.proto";
-import "error_codes.proto";
+import "error/coordinator.proto";
 import "graph_def.proto";
 import "types.proto";
 
diff --git a/proto/proto_generator.py b/proto/proto_generator.py
index 85344d85da9a..ff4227f4b02d 100644
--- a/proto/proto_generator.py
+++ b/proto/proto_generator.py
@@ -38,6 +38,8 @@ def create_path(path):
 
 def cpp_out(relative_dir, output_dir):
     files = gather_all_proto(relative_dir)
+    error_files = gather_all_proto(os.path.join(relative_dir, "error"), suffix="coordinator.proto")
+    files.extend(error_files)
     for proto_file in files:
         cmd = [
             shutil.which("protoc"),
@@ -54,7 +56,9 @@ def cpp_out(relative_dir, output_dir):
 def python_out(relative_dir, output_dir):
     files = gather_all_proto(relative_dir)
     groot_files = gather_all_proto(os.path.join(relative_dir, "groot", "sdk"))
+    error_files = gather_all_proto(os.path.join(relative_dir, "error"))
     files.extend(groot_files)
+    files.extend(error_files)
     for proto_file in files:
         cmd = [
             sys.executable,
diff --git a/python/graphscope/client/rpc.py b/python/graphscope/client/rpc.py
index cf65ca5932d2..58f5c131a5fa 100644
--- a/python/graphscope/client/rpc.py
+++ b/python/graphscope/client/rpc.py
@@ -30,8 +30,8 @@
 from graphscope.client.utils import handle_grpc_error
 from graphscope.client.utils import suppress_grpc_error
 from graphscope.proto import coordinator_service_pb2_grpc
-from graphscope.proto import error_codes_pb2
 from graphscope.proto import message_pb2
+from graphscope.proto.error import coordinator_pb2
 from graphscope.version import __version__
 
 logger = logging.getLogger("graphscope")
@@ -184,10 +184,11 @@ def _run_step_impl(self, dag_def):
         response = self._grpc_utils.parse_runstep_responses(
             self._stub.RunStep(runstep_requests)
         )
-        if response.code != error_codes_pb2.OK:
+
+        if response.code != coordinator_pb2.OK:
             logger.error(
                 "Runstep failed with code: %s, message: %s",
-                error_codes_pb2.Code.Name(response.code),
+                coordinator_pb2.Code.Name(response.code),
                 response.error_msg,
             )
             if response.full_exception:
diff --git a/python/graphscope/framework/errors.py b/python/graphscope/framework/errors.py
index 164b22721d7c..d627781597c3 100644
--- a/python/graphscope/framework/errors.py
+++ b/python/graphscope/framework/errors.py
@@ -18,8 +18,8 @@
 
 import inspect
 
-from graphscope.proto import error_codes_pb2
 from graphscope.proto import op_def_pb2
+from graphscope.proto.error import coordinator_pb2
 
 # All kinds of GraphScope error.
 __all__ = [
@@ -49,7 +49,7 @@
 class _ReprableString(str):
     """A special class that prevents `repr()` adding extra `""` to `str`.
 
-    It is used to optimize the user experiences to preseve `\n` when printing exceptions.
+    It is used to optimize the user experiences to preserve `\n` when printing exceptions.
     """
 
     def __repr__(self) -> str:
@@ -149,27 +149,69 @@ class RetriesExceededError(GSError):
     pass
 
 
+class CancelledError(GSError):
+    pass
+
+
+class ResourceExhaustedError(GSError):
+    pass
+
+
+class PortInUseError(GSError):
+    pass
+
+
+class UnsupportedOperationError(GSError):
+    pass
+
+
+class IllegalStateError(GSError):
+    pass
+
+
+class NetworkFailureError(GSError):
+    pass
+
+
+class ConnectionError(GSError):
+    pass
+
+
+class GremlinQueryError(GSError):
+    pass
+
+
+class WorkerResultsInconsistentError(GSError):
+    pass
+
+
 _gs_error_types = {
-    error_codes_pb2.TIMEOUT_ERROR: TimeoutError,
-    error_codes_pb2.NOT_FOUND_ERROR: NotFoundError,
-    error_codes_pb2.CONNECTION_ERROR: ConnectionError,
-    error_codes_pb2.VINEYARD_ERROR: VineyardError,
-    error_codes_pb2.COMPILATION_ERROR: CompilationError,
-    error_codes_pb2.ALREADY_EXISTS_ERROR: AlreadyExistsError,
-    error_codes_pb2.UDF_INTERNAL_ERROR: UDFInternalError,
-    error_codes_pb2.UNAVAILABLE_ERROR: UnavailableError,
-    error_codes_pb2.INVALID_ARGUMENT_ERROR: InvalidArgumentError,
-    error_codes_pb2.PERMISSION_DENIED_ERROR: PermissionDeniedError,
-    error_codes_pb2.NETWORK_ERROR: NetworkError,
-    error_codes_pb2.K8S_ERROR: K8sError,
-    error_codes_pb2.UNIMPLEMENTED_ERROR: UnimplementedError,
-    error_codes_pb2.ANALYTICAL_ENGINE_INTERNAL_ERROR: AnalyticalEngineInternalError,
-    error_codes_pb2.INTERACTIVE_ENGINE_INTERNAL_ERROR: InteractiveEngineInternalError,
-    error_codes_pb2.LEARNING_ENGINE_INTERNAL_ERROR: LearningEngineInternalError,
-    error_codes_pb2.COORDINATOR_INTERNAL_ERROR: CoordinatorInternalError,
-    error_codes_pb2.UNKNOWN_ERROR: UnknownError,
-    error_codes_pb2.FATAL_ERROR: FatalError,
-    error_codes_pb2.RETRIES_EXCEEDED_ERROR: RetriesExceededError,
+    coordinator_pb2.CANCELLED: CancelledError,
+    coordinator_pb2.INVALID_ARGUMENT: InvalidArgumentError,
+    coordinator_pb2.TIMEOUT: TimeoutError,
+    coordinator_pb2.NOT_FOUND: NotFoundError,
+    coordinator_pb2.ALREADY_EXISTS: AlreadyExistsError,
+    coordinator_pb2.RESOURCE_EXHAUSTED: ResourceExhaustedError,
+    coordinator_pb2.UNIMPLEMENTED: UnimplementedError,
+    coordinator_pb2.PERMISSION_DENIED: PermissionDeniedError,
+    coordinator_pb2.COMPILATION_FAILURE: CompilationError,
+    coordinator_pb2.PORT_IN_USE: PortInUseError,
+    coordinator_pb2.UNSUPPORTED_OPERATION: UnsupportedOperationError,
+    coordinator_pb2.ILLEGAL_STATE: IllegalStateError,
+    coordinator_pb2.NETWORK_FAILURE: NetworkFailureError,
+    coordinator_pb2.CONNECTION_ERROR: ConnectionError,
+    coordinator_pb2.VINEYARD_ERROR: VineyardError,
+    coordinator_pb2.UDF_INTERNAL_ERROR: UDFInternalError,
+    coordinator_pb2.K8S_ERROR: K8sError,
+    coordinator_pb2.GREMLIN_QUERY_ERROR: GremlinQueryError,
+    coordinator_pb2.RETRIES_EXCEEDED_ERROR: RetriesExceededError,
+    coordinator_pb2.ANALYTICAL_ENGINE_INTERNAL_ERROR: AnalyticalEngineInternalError,
+    coordinator_pb2.INTERACTIVE_ENGINE_INTERNAL_ERROR: InteractiveEngineInternalError,
+    coordinator_pb2.LEARNING_ENGINE_INTERNAL_ERROR: LearningEngineInternalError,
+    coordinator_pb2.COORDINATOR_INTERNAL_ERROR: CoordinatorInternalError,
+    coordinator_pb2.WORKER_RESULTS_INCONSISTENT_ERROR: WorkerResultsInconsistentError,
+    coordinator_pb2.UNKNOWN_ERROR: UnknownError,
+    coordinator_pb2.FATAL_ERROR: FatalError,
 }
 
 
diff --git a/python/graphscope/proto/error/__init__.py b/python/graphscope/proto/error/__init__.py
new file mode 100644
index 000000000000..618dda69a7be
--- /dev/null
+++ b/python/graphscope/proto/error/__init__.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright 2020 Alibaba Group Holding Limited. All Rights Reserved.
+#
+# Licensed 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.
+#


Test patch:
diff --git a/interactive_engine/executor/store/groot/src/db/graph/tests/helper.rs b/interactive_engine/executor/store/groot/src/db/graph/tests/helper.rs
index d7c556bd6ccd..89e5c9bac48c 100644
--- a/interactive_engine/executor/store/groot/src/db/graph/tests/helper.rs
+++ b/interactive_engine/executor/store/groot/src/db/graph/tests/helper.rs
@@ -407,7 +407,7 @@ impl<'a, G: MultiVersionGraph> GraphTestHelper<'a, G> {
     fn check_and_update_si(&mut self, si: SnapshotId) -> GraphResult<()> {
         if si < self.cur_si {
             let msg = format!("si#{} is less than cur_si#{}", si, self.cur_si);
-            let err = gen_graph_err!(GraphErrorCode::InvalidOperation, msg, check_and_update_si, si);
+            let err = gen_graph_err!(ErrorCode::INVALID_OPERATION, msg, check_and_update_si, si);
             return Err(err);
         }
         self.cur_si = si;
diff --git a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/client/RoleClientsTest.java b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/client/RoleClientsTest.java
index cd26eabb581e..c750afebf461 100644
--- a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/client/RoleClientsTest.java
+++ b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/client/RoleClientsTest.java
@@ -18,7 +18,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.NodeConnectException;
+import com.alibaba.graphscope.groot.common.exception.NetworkFailureException;
 import com.alibaba.graphscope.groot.rpc.ChannelManager;
 import com.alibaba.graphscope.groot.rpc.RoleClients;
 import com.alibaba.graphscope.groot.rpc.RpcChannel;
@@ -41,7 +41,7 @@ void testRoleClients() {
                 new RoleClients<>(channelManager, RoleType.STORE, MockRoleClient::new);
         channelManager.start();
         assertNotNull(clients.getClient(0));
-        assertThrows(NodeConnectException.class, () -> clients.getClient(1));
+        assertThrows(NetworkFailureException.class, () -> clients.getClient(1));
         channelManager.stop();
     }
 
diff --git a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/rpc/ChannelManagerTest.java b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/rpc/ChannelManagerTest.java
index ff7b4ff6b588..d2612a960ed3 100644
--- a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/rpc/ChannelManagerTest.java
+++ b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/common/rpc/ChannelManagerTest.java
@@ -16,7 +16,7 @@
 import com.alibaba.graphscope.groot.common.RoleType;
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
-import com.alibaba.graphscope.groot.common.exception.NodeConnectException;
+import com.alibaba.graphscope.groot.common.exception.NetworkFailureException;
 import com.alibaba.graphscope.groot.rpc.ChannelManager;
 
 import org.junit.jupiter.api.Assertions;
@@ -36,7 +36,7 @@ void testChannelManager() {
         channelManager.start();
         Assertions.assertNotNull(channelManager.getChannel(RoleType.STORE, 0));
         Assertions.assertThrows(
-                NodeConnectException.class, () -> channelManager.getChannel(RoleType.STORE, 1));
+                NetworkFailureException.class, () -> channelManager.getChannel(RoleType.STORE, 1));
         channelManager.stop();
     }
 }
diff --git a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/coordinator/CoordinatorRpcTest.java b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/coordinator/CoordinatorRpcTest.java
index 5ce6946ada60..d2925ead3c58 100644
--- a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/coordinator/CoordinatorRpcTest.java
+++ b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/coordinator/CoordinatorRpcTest.java
@@ -17,6 +17,7 @@
 import static org.mockito.Mockito.*;
 
 import com.alibaba.graphscope.groot.CompletionCallback;
+import com.alibaba.graphscope.groot.common.exception.DdlException;
 import com.alibaba.graphscope.groot.common.schema.wrapper.GraphDef;
 import com.alibaba.graphscope.groot.common.util.BackupInfo;
 import com.alibaba.graphscope.groot.coordinator.*;
@@ -26,7 +27,6 @@
 import com.alibaba.graphscope.groot.coordinator.backup.BackupService;
 import com.alibaba.graphscope.groot.coordinator.backup.StoreBackupClient;
 import com.alibaba.graphscope.groot.rpc.RoleClients;
-import com.alibaba.graphscope.groot.schema.request.DdlException;
 import com.alibaba.graphscope.groot.store.backup.StoreBackupId;
 import com.alibaba.graphscope.proto.groot.*;
 
diff --git a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraph.java b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraph.java
index ed827949005b..dd52b2abdc00 100644
--- a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraph.java
+++ b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraph.java
@@ -18,7 +18,8 @@
 import com.alibaba.graphscope.groot.common.config.CommonConfig;
 import com.alibaba.graphscope.groot.common.config.Configs;
 import com.alibaba.graphscope.groot.common.config.FrontendConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
+import com.alibaba.graphscope.groot.common.exception.UnsupportedOperationException;
 import com.alibaba.graphscope.groot.sdk.GrootClient;
 import com.alibaba.graphscope.groot.sdk.schema.Edge;
 import com.alibaba.graphscope.groot.sdk.schema.Vertex;
@@ -78,7 +79,7 @@ public GrootGraph(Configs configs) {
             this.remoteConnection = DriverRemoteConnection.using(cluster);
         } catch (Throwable e) {
             this.closeGraph();
-            throw new GrootException(e);
+            throw new InvalidArgumentException(e);
         }
     }
 
diff --git a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraphProvider.java b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraphProvider.java
index eb23bffac8dc..17636917cc8c 100644
--- a/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraphProvider.java
+++ b/interactive_engine/groot-server/src/test/java/com/alibaba/graphscope/groot/tests/gremlin/GrootGraphProvider.java
@@ -14,7 +14,7 @@
 package com.alibaba.graphscope.groot.tests.gremlin;
 
 import com.alibaba.graphscope.groot.common.config.StoreConfig;
-import com.alibaba.graphscope.groot.common.exception.GrootException;
+import com.alibaba.graphscope.groot.common.exception.InvalidArgumentException;
 
 import org.apache.commons.configuration2.Configuration;
 import org.apache.tinkerpop.gremlin.AbstractGraphProvider;
@@ -51,7 +51,7 @@ public Map<String, Object> getBaseConfiguration(
                         .getResourceAsStream("gremlin-test.config")) {
             properties.load(ins);
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new InvalidArgumentException(e);
         }
         properties.put(Graph.GRAPH, GrootGraph.class.getName());
         if (this.storeDataPath == null) {
@@ -80,7 +80,7 @@ public void loadGraphData(
             loadedGraphs.add(graphData);
         } catch (URISyntaxException | IOException e) {
             logger.error("load schema failed", e);
-            throw new GrootException(e);
+            throw new InvalidArgumentException(e);
         } catch (InterruptedException e) {
             logger.error("load data failed", e);
         }