fether
fether copied to clipboard
Node syncing, but showing "Synced"

This screenshot was taken ~10s after I arrived on the TokensList page.
This happened to me this week-end on mainnet, I was trying to narrow it down. It did not happen when letting Fether launch parity itself AFAIR
I've been able to replicate the issue using Parity-Ethereum/v2.1.9-stable-af1169d2f-20181205/x86_64-macos/rustc1.30.1 by:
- running Parity Ethereum
./target/release/parity --chain kovan --light
- running Fether
yarn; yarn build; yarn start
- killing and restarting Parity Ethereum
@amaurymartiny @Tbaut
Reproducing the Bug
Terminal 1 - Start Parity Ethereum
- Run
./target/release/parity --chain kovan --light
Terminal 2 - Start Fether
-
Changed the contents of paritytech/fether/packages/fether-react/src/utils/withHealth.js with the code in this branch/commit
- https://github.com/paritytech/fether/commit/7763bf8952f31c0321875cc1f996815ac55b2349
-
Run
yarn; yarn build;
yarn start;
- View Developer Tools > Console
Terminal 1 - Kill Parity Ethereum
-
Press CMD+C so it stops running
-
Delete the Kovan Light Chain database so its no longer at head block
./target/release/parity --chain kovan --light db kill
Terminal 2 - Reload Fether and Clear the Developer Tools Console
-
Press CMD+R (View > Reload)
-
Go to Electron > View > Toggle Developer Tools. Change to the "Console" tab. Press CTRL+L (or click the icon that looks like a no entry sign)
Terminal 1 - Restart Parity Ethereum
- Run
./target/release/parity --chain kovan --light
Debugging the Bug
- Initially in the bottom-right corner on the accounts list page of the Fether UI it displayed 'Not connected to any peer'.
In Developer Tools it displayed the following based on my console.logs:
ws:onClose trying again in 3.82s...
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}children: {$$typeof: Symbol(react.element), key: null, ref: null, props: {…}, type: ƒ, …}fullscreen: truehealth: {status: Symbol(LAUNCHING)}require: "connected"__proto__: Object
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}children: {$$typeof: Symbol(react.element), key: null, ref: null, props: {…}, type: ƒ, …}fullscreen: truehealth: {status: Symbol(LAUNCHING)}require: "connected"__proto__: Object
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}children: {$$typeof: Symbol(react.element), key: null, ref: null, props: {…}, type: ƒ, …}fullscreen: truehealth: {status: Symbol(NOPEERS)}require: "connected"__proto__: Object
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}chainName: "kovan"health: {status: Symbol(NOPEERS)}__proto__: Object
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}chainName: "kovan"health: {status: Symbol(NOPEERS)}status: Symbol(NOPEERS)__proto__: Object__proto__: Object
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}chainName: "kovan"health: status: Symbol(NOPEERS)__proto__: Object__proto__: Object
withHealth.js:236 -------------------
withHealth.js:237
- Then it changed to 'Synced(kovan)' for a while even though it was only at current block ~9393409 when the highest block was 9962807 (since I had killed the db).
In Developer Tools it continued to displayed logs including the following based on my console.logs:
...
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): connected
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 6
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}children: {$$typeof: Symbol(react.element), key: null, ref: null, props: {…}, type: ƒ, …}fullscreen: truehealth: {status: Symbol(GOOD)}require: "connected"__proto__: Object
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): undefined
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 6
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): connected
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): undefined
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
...
- Then it changed to 'Syncing...(2%) (kovan)'
In Developer Tools it continued to displayed logs including the following based on my console.logs:
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): connected
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962807
withHealth.js:217 percentage 1.28705215820478414485
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 6
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): undefined
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962807
withHealth.js:217 percentage 1.28705215820478414485
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 6
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): connected
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962807
withHealth.js:217 percentage 1.28705215820478414485
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): undefined
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962807
withHealth.js:217 percentage 1.28705215820478414485
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): connected
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962806
withHealth.js:217 percentage 1.2870543894899804272
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): undefined
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962806
withHealth.js:217 percentage 1.2870543894899804272
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 5
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
withHealth.js:204 -------------------
withHealth.js:205 withHealth.js - DURING .map
withHealth.js:206 SYNCING with:
withHealth.js:207 isParityRunning: true
withHealth.js:208 isApiConnected: true
withHealth.js:209 props.require (connected?): connected
withHealth.js:210 downloadProgress: 0
withHealth.js:211 online: true
withHealth.js:212 isClockSync: true
withHealth.js:213 isSync: false
withHealth.js:214 syncPayload: {currentBlock: BigNumber, highestBlock: BigNumber, percentage: BigNumber, startingBlock: BigNumber}
withHealth.js:215 current block 9393409
withHealth.js:216 highest block 9962806
withHealth.js:217 percentage 1.2870543894899804272
withHealth.js:218 starting block 9385985
withHealth.js:219 props.health
withHealth.js:220 sync status undefined
withHealth.js:221 current block undefined
withHealth.js:222 highest block undefined
withHealth.js:223 percentage undefined
withHealth.js:224 starting block undefined
withHealth.js:225 peerCount: 7
...
- Then if I wait until it is truly synced and it displays 'Synced (kovan)'
In Developer Tools it continued to displayed logs including the following based on my console.logs:
...
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): connected
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 7
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {require: "connected", fullscreen: true, children: {…}, health: {…}}
withHealth.js:236 -------------------
withHealth.js:237 withHealth.js - DURING .map
withHealth.js:238 GOOD with:
withHealth.js:239 isParityRunning: true
withHealth.js:240 isApiConnected: true
withHealth.js:241 props.require (connected?): undefined
withHealth.js:242 downloadProgress: 0
withHealth.js:243 online: true
withHealth.js:244 isClockSync: true
withHealth.js:245 isSync: true
withHealth.js:246 syncPayload: undefined
withHealth.js:247 current block undefined
withHealth.js:248 highest block undefined
withHealth.js:249 percentage undefined
withHealth.js:250 starting block undefined
withHealth.js:251 props.health
withHealth.js:252 sync status undefined
withHealth.js:253 current block undefined
withHealth.js:254 highest block undefined
withHealth.js:255 percentage undefined
withHealth.js:256 starting block undefined
withHealth.js:257 peerCount: 7
withHealth.js:271 ---------------
withHealth.js:272 withHeath.js - AFTER .map
withHealth.js:273 props {chainName: "kovan", health: {…}}
...
Observations & Questions
-
Why causes the values passed down in the
props
to alternate between being the following:-
props {require: "connected", fullscreen: true, children: {…}, health: {…}}
-
props {chainName: "kovan", health: {…}}
-
-
Why does the value of
props.require
alternate betweenundefined
and"connected"
, both when it is GOOD or SYNCING? -
The value of
isSync
is initiallytrue
when it is GOOD, but then changes tofalse
when it is SYNCING (due to logic in withHealth.js) -
Why is the
props.health.status
alwaysundefined
? -
All the values that we console.log when it incorrectly says that it is GOOD before it has finished (or even started) syncing are identical to the values that we console.log when it correctly says that it is GOOD (when it is actually synced). What existing or new props can we use or memoize so we can differentiate?
-
Another strange thing that I observed in the console.logs on one occasion was that when it started syncing the
props.health.payload.percentage
value was approx 1.5, and then it changed back to 0 again 🔨 -
Why is the value of the following props
undefined
when its GOOD?-
props.health.payload.currentBlock
-
props.health.payload.highestBlock
-
props.health.payload.percentage
-
props.health.payload.startingBlock
-
Note: If when we are actually fully synced these properties had values or we saved the values instead of them being
undefined
(i.e. ifpercentage
was100
or thereabouts, andcurrentBlock
was equal tohighestBlock
) then we could change the logic in withHealth.js so it enters the "if statement" associated with the// Syncing blocks
comment. So instead of it just beingif (!isSync) { ...
, we could change it to:
-
if (
!isSync ||
!props.health ||
props.health.status === 'GOOD' ||
!props.health.payload ||
props.health.payload.currentBlock < props.health.payload.highestBlock ||
props.health.payload.percentage < 100
) {
Then it changed to 'Syncing...(2%) (kovan)'
Because of this I don't think that you had the bug. I had it (also saying it's synced on Kovan whereas it was syncing Mainnet) and it remained like this.
ps: I removed the labels because they characterize the issue from OP (it's not a question) and pleasereview
is reserved for PRs.
In withHealth.js, we have:
map(syncStatus => {
if (!syncStatus) {
return {
isSync: true
};
}
So when we don't know the sync status we're saying that we're synchronised.
I think if we don't know the sync status we should say that we're no synchronised i.e. change it to isSync: false
.
Perhaps the cause of this Github issue showing "Synced" when the Node is still syncing occurs because the syncStatus
is undefined for some reason although the Node is still syncing.
@ltfschoen syncStatus
being false
here means that we're synced. It's the result of eth_syncing
However by default we say that we're synced startWith([{ isSync: false }, undefined])
. Thibaut fixed a bug in the syncing status reported by withHealth in https://github.com/paritytech/fether/pull/385 ; we should verify if we still have this bug on master now.