Backports to beta (#7660)
* Improve handling of RocksDB corruption (#7630) * kvdb-rocksdb: update rust-rocksdb version * kvdb-rocksdb: mark corruptions and attempt repair on db open * kvdb-rocksdb: better corruption detection on open * kvdb-rocksdb: add corruption_file_name const * kvdb-rocksdb: rename mark_corruption to check_for_corruption * Hardening of CSP (#7621) * Fixed delegatecall's from/to (#7568) * Fixed delegatecall's from/to, closes #7166 * added tests for delegatecall traces, #7167 * Light client RPCs (#7603) * Implement registrar. * Implement eth_getCode * Don't wait for providers. * Don't wait for providers. * Fix linting and wasm tests. * Problem: AttachedProtocols don't get registered (#7610) I was investigating issues I am having with Whisper support. I've enabled Whisper on a custom test network and inserted traces into Whisper handler implementation (Network<T> and NetworkProtocolHandler for Network<T>) and I noticed that the handler was never invoked. After further research on this matter, I found out that AttachedProtocol's register function does nothing: https://github.com/paritytech/parity/blob/master/sync/src/api.rs#L172 but there was an implementation originally: 99075ad#diff-5212acb6bcea60e9804ba7b50f6fe6ec and it did the actual expected logic of registering the protocol in the NetworkService. However, as of 16d84f8#diff-5212acb6bcea60e9804ba7b50f6fe6ec ("finished removing ipc") this implementation is gone and only the no-op function is left. Which leads me to a conclusion that in fact Whisper's handler never gets registered in the service and therefore two nodes won't communicate using it. Solution: Resurrect original non-empty `AttachedProtocols.register` implementation Resolves #7566 * Fix Temporarily Invalid blocks handling (#7613) * Handle temporarily invalid blocks in sync. * Fix tests.
This commit is contained in:
committed by
Afri Schoedon
parent
a8fc42d282
commit
fa6a0a6b60
@@ -65,15 +65,15 @@ export default function (api, browserHistory, forEmbed = false) {
|
||||
.then(() => console.log('v1: started Status Provider'))
|
||||
|
||||
.then(() => console.log('v1: starting Personal Provider...'))
|
||||
.then(() => PersonalProvider.start())
|
||||
.then(() => withTimeoutForLight('personal', PersonalProvider.start(), store))
|
||||
.then(() => console.log('v1: started Personal Provider'))
|
||||
|
||||
.then(() => console.log('v1: starting Balances Provider...'))
|
||||
.then(() => BalancesProvider.start())
|
||||
.then(() => withTimeoutForLight('balances', BalancesProvider.start(), store))
|
||||
.then(() => console.log('v1: started Balances Provider'))
|
||||
|
||||
.then(() => console.log('v1: starting Tokens Provider...'))
|
||||
.then(() => TokensProvider.start())
|
||||
.then(() => withTimeoutForLight('tokens', TokensProvider.start(), store))
|
||||
.then(() => console.log('v1: started Tokens Provider'));
|
||||
};
|
||||
|
||||
@@ -97,3 +97,39 @@ export default function (api, browserHistory, forEmbed = false) {
|
||||
|
||||
return store;
|
||||
}
|
||||
|
||||
function withTimeoutForLight (id, promise, store) {
|
||||
const { nodeKind } = store.getState().nodeStatus;
|
||||
const isLightNode = nodeKind.capability !== 'full';
|
||||
|
||||
if (!isLightNode) {
|
||||
// make sure that no values are passed
|
||||
return promise.then(() => {});
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let isResolved = false;
|
||||
const doResolve = () => {
|
||||
if (!isResolved) {
|
||||
isResolved = true;
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
const timeout = setTimeout(() => {
|
||||
console.warn(`Resolving ${id} by timeout.`);
|
||||
doResolve();
|
||||
}, 1000);
|
||||
|
||||
promise
|
||||
.then(() => {
|
||||
clearTimeout(timeout);
|
||||
doResolve();
|
||||
})
|
||||
.catch(err => {
|
||||
clearTimeout(timeout);
|
||||
if (!isResolved) {
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user