From ac1cbdee4d4e3bc82595f1d1322d8af63fb01d98 Mon Sep 17 00:00:00 2001
From: Robert Martin-Legene <robert@nic.ar>
Date: Wed, 21 Jul 2021 18:32:35 +0000
Subject: [PATCH] Importdb

---
 bin/bfa | 63 +++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 39 insertions(+), 24 deletions(-)

diff --git a/bin/bfa b/bin/bfa
index 152de13..cf05557 100755
--- a/bin/bfa
+++ b/bin/bfa
@@ -139,7 +139,7 @@ function    graceful
     if [ -z "$pids" ]
     then
         echo "Nothing to send signals to." >&2
-        exit 1
+        return
     fi
     sendsig -TERM "$pids"
     sleep 1
@@ -170,15 +170,15 @@ function    initdb
 register_subcommand 'exportdb' 'exportdb' 'Export blockchain in chunks of 1 million blocks per file.'
 function    exportdb
 {
-    local delta maxblocks blockstart toblock filename
-    delta=1000000
+    local million maxblocks blockstart toblock filename
+    million=1000000
     graceful
     maxblocks=$(bfageth --exec 'eth.blockNumber' console 2> /dev/null)
     # 0 is genesis.. shouldn't dump that
     blockstart=1
     while [ "$blockstart" -lt "$maxblocks" ]
     do
-        toblock=$(( blockstart + delta - 1 ))
+        toblock=$(( blockstart + million - 1 ))
         test "$toblock" -gt "$maxblocks" &&
             toblock=$maxblocks
         printf -v filename 'bfa2018.blocks.%09d-%09d.export.gz' "$blockstart" "$toblock"
@@ -194,28 +194,43 @@ function    exportdb
 register_subcommand 'importdb' 'importdb' 'Import blocks safely from previous block exports.'
 function    importdb
 {
-    local dumpurl delta blockstart toblock
+    local dumpurl million blockstart continue_at haveblocks theirsize oursize
     dumpurl="https://s3.wasabisys.com/bfa/blockdumps"
-    delta=1000000
+    million=1000000
     graceful
-    blockstart=1
+    haveblocks=$(bfageth --exec 'eth.blockNumber' console 2> /dev/null)
+    blockstart=$((haveblocks/million*million+1))
     while :
     do
-        toblock=$(( blockstart + delta - 1 ))
-        printf -v filename 'bfa2018.blocks.%09d-%09d.export.gz' "$blockstart" "$toblock"
-        curl --fail "${dumpurl}/${filename}" || break
-	blockstart=$(( toblock + 1 ))
+        printf -v filename 'bfa2018.blocks.%09d-%09d.export.gz' "$blockstart" "$((blockstart + million - 1))"
+	blockstart=$((blockstart + million))
+        read -r theirsize < <( curl --head "${dumpurl}/${filename}" 2>/dev/null | grep -i '^Content-Length: ' | head -1 )
+        if [ -z "$theirsize" ]
+        then
+            break
+        else
+            theirsize="${theirsize//*: }"
+            # remove trailing newline
+            theirsize="${theirsize%$'\r'}"
+        fi
+        #
+        if [ -r "$filename" ]
+        then
+            oursize=$(stat -c %s "$filename")
+            continue_at="--continue-at $oursize"
+        else
+            oursize=0
+            continue_at=
+        fi
+        if [ "${oursize:-0}" -lt "$theirsize" ]
+        then
+            echo "Downloading $filename"
+            curl --fail $continue_at -o "$filename" "${dumpurl}/${filename}" || break
+        fi
+        # shellcheck disable=SC2086
+        bfageth import <(gzip -dc "$filename")
+        rm -f "$filename"
     done
-    geth --networkid "${BFANETWORKID}" --datadir "${BFANODEDIR}" --syncmode "full" --gcmode "archive" import <(
-    	n=1
-        printf -v filename 'bfa2018.blocks.%09d-%09d.export.gz' "$n" "$((n + delta - 1))"
-    	while gzip -dc "$filename" 2>/dev/null
-    	do
-		n=$((n + delta))
-                printf -v filename 'bfa2018.blocks.%09d-%09d.export.gz' "$n" "$((n + delta - 1))"
-    	done
-	true
-    )
 }
 
 register_subcommand 'syncmode' 'admin_syncmode' 'Set initial synchronization mode.'
@@ -381,7 +396,7 @@ function    bfageth
         echo "You should not run this command without any arguments. Start the background processes with start.sh instead." >&2
         exit 1
     fi
-    exec geth --config "${BFANETWORKDIR}/config.localhost+full+archive" "$@"
+    geth --config "${BFANETWORKDIR}/config.localhost+full+archive" "$@"
 }
 
 function    bfaadmin
@@ -427,7 +442,7 @@ function    main
             test -n "$cmd" || _usage
             test -n "${commands[$cmd]}" || _usage
             # shellcheck disable=SC2086
-            eval ${commands[$cmd]} "$*"
+            eval ${commands[$cmd]} "$@"
             ;;
         'admin.sh')
             bfaadmin "$@"
@@ -441,4 +456,4 @@ function    main
     esac
 }
 
-main "$*"
+main "$@"
-- 
GitLab