This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Allow updating configuration of changes tries - #3201

Merged
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration
Jan 16, 2020
Merged

Allow updating configuration of changes tries#3201
gavofyork merged 80 commits into
masterfrom
changes_tries_update_configuration

Conversation

@svyatonik

@svyatoniksvyatonik commented Jul 25, 2019

Copy link
Copy Markdown
Contributor

IMPORTANT NOTES FOR REVIEWERS

  1. this PR adds column to the database, but provides no upgrade functionality. I've checked that last time we changed this constant, there were also no upgrade. But it has been ~4 months ago, so probably we need to implement auto-upgrade now?
  2. this PR should change absolutely nothing when chain is configured to work without changes tries (which is by default). That's (IMO) the main thing to look at in this PR

=================================================================

Follow up of #2840 (comment)

This PR introduces new changes-tries related digest item (ChangesTrieSignal) + separate SRML method that is used to change CT configuration (and emits this signal). It is also possible to use the same signal for emergency creation of max-level digest CT, though it'll be implemented in next PRs.

The idea is to use consensus cache (which from now shouldn't be called consensus cache anymore) to hold intervals (and also config itself) where CT configuration hasn't be changed. When building CT, you only need actual CT configuration => work is done within single interval. When fetching key changes/proof, this may affect several intervals => every interval will have its own state_machine/src/changes_trie/* related call.

Detailed description:

  • (extracted to separate PR) cache is modified to support pruning strategy selection - we do not actually need authorities once block is finalized (so cached entries can be pruned). But we may need to hold changes tries configuration forever. So there are two strategies: NeverPrune and ByDepth(N);
  • (extracted to separate PR) since cache is now not consensus-specific, I've moved well_known_cache_keys from consensus_common to the client::backend;
  • moved db-backed changes trie storage (DbChangesTrieStorage) from the db/src/lib.rs into dedicated file db/src/changes_tries_storage.rs. Now it holds reference to the cache where configuration changes are stored;
  • (extracted to separate PR) state_machine methods now accept new struct ChangesTrieState instead of simply ChangesTrieStorage. In addition to storage reference, it holds: active changes trie configuration and zero block of this configuration (i.e. parent block of the block where first changes trie is built using this configuration). This is required to build changes trie at current block;
  • Client::key_changes and Client::key_changes_proof are updated to support ranges where CT configuration has been changed. Client::max_key_changes_range isn't updated yet, because it tightly related to pruning (see below);
  • (extracted to separate PR)SurfaceIterator is extracted to dedicated state_machine/src/changes_trie/surface_iterator.rs;
  • (extracted to separate PR) when changes trie configuration change is detected inside the build.rs, max level digest is created. It may be a skewed digest (the digest that is created ahead of schedule), or a normal digest.
  • key changes functions are updated to support skewed digests.

Changes tries are pruned similarly to what has been before - i.e. there's a block for which we guarantee that all changes tries (if created) after this block are valid (i.e. if we prune some trie, then the digest trie that points to it, is also pruned) and all changes tries before this block should not be accessed. Since we now have tries that are built using different configurations, we store this block in special metadata entry (because it isn't that easy to calculate it).

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. M4-core labels Jul 25, 2019
@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Duplicating IMPORTANT NOTE here: please only merge this PR if you sure that we do not need code for db upgrade here. I haven't did that - not sure if it is required. If merged as-is, this PR will break all existing databases => nodes will be unable to start with old databases. Please respond if you think we should start database versioning stuff.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A5-grumble labels Jan 9, 2020
@gavofyork

Copy link
Copy Markdown
Member

will this affect typical deployments (like kusama nodes)?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

@Demi-Marie

Copy link
Copy Markdown
Contributor

@svyatonik will nodes with this patch be able to sync from nodes without it?

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

@demimarie-parity Yes, it changes nothing in how blocks on existing chains are processed.

@gavofyork

Copy link
Copy Markdown
Member

If you're talking about breaking db - yes, this will affect all nodes. So you can't just copy binary over previous - we need to erase db && then (if there's another source of blocks on the network), it'll sync from the scratch.

how much trouble would a DB migration be? we have a semi-production network of ~500 nodes out there and i don't really want to have to force them all to resync on the next minor revision..

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Re upgrade performance - I'm not sure yet. Re code - shouldn't be a big issue, I just thought that maybe we do not need it yet. We have changed db format several times, but there never been any upgrade code. But it was probably been before Kusama. So I'll add db upgrade here. Will try to keep it localized in single commit to make it easy reviewable.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

(or perhaps will open additional PR to the changes_tries_update_configuration branch - I believe set of reviewers should be different)

@gavofyork

Copy link
Copy Markdown
Member

this one shouldn't be merged without migration code, so probably best if it's a single commit on top of this.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

This commit implements database upgrade. The only upgrade now is from v0 to v1, which: (1) adds new column to the database and (2) initializes changes tries configuration cache (with None configuration).

I also forgot that I've promised to sync Kusama with these changes in some of comments above => will temporary switch to inprogress and revert will try to sync.

@svyatoniksvyatonik added A3-in_progress Pull request is in progress. No review needed at this stage. and removed A0-please_review Pull request needs code review. labels Jan 14, 2020
@cheme

Copy link
Copy Markdown
Contributor

Had a quick peak on the db commit. Things looks good (considering meta column is the same between light and full).
Makes me think about a possible change (not sure it is needed but anyway it can be added later):

  • here new client instance will apply all upgrade in sequence. We could also have kvdb-rocksdb with a new function to check if db already exists and add a latest version file on creation (by default only run upgrade on client with existing db).
  • previous point does make sense but it is also a possible cause for error (if upgrade code does not match initialization code), so it is only interesting if we can manage db version per client (eg at this point polkadot version 0 corresponding to kusama version 1). So the versioning and upgrade code would be define per project, probably putting thing being an upgradedb trait and including the impl in cli initialisation parameters.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

Thanks for taking a time to review! I agree that function like db.exists() would be much better than the current approach. Probably we could even use directory.exists() here. But that could be added on next upgrade. For now I would prefer to stick with current version. The reason is simple: (1) now we have only one upgrade which works in both cases (when db_version exists and contains "0" and when it does not exists) (2) I hope most of nodes will upgrade to v1 (and db_version will be created with "1") until next upgrade (v2) will be required. This way we could minimize number of nodes that are upgrading from "either v0, or v2" to "v2" - in most cases we'll either have "v1", or "v2" (i.e. there'll (almost) be no nodes without db_version file).

As for the second - I'm not sure we are exposing anything internal from database to clients. The only exception is aux storage, but it already has its own upgrade path - see e.g. upgrade_from_*here. So I don't think there's a need for providing different upgrade scenarios for different projects. I'd say projects should use dedicated storage for their own needs.

@svyatonik

Copy link
Copy Markdown
ContributorAuthor

So I've finally synced both Kusama clients (full/light) with this PR - everything seems fine for me.

@svyatoniksvyatonik added A0-please_review Pull request needs code review. and removed A3-in_progress Pull request is in progress. No review needed at this stage. labels Jan 16, 2020
@gavofyorkgavofyork added A8-looksgood and removed A0-please_review Pull request needs code review. A1-onice labels Jan 16, 2020
@gavofyork
gavofyork merged commit 8e98643 into masterJan 16, 2020
@gavofyork
gavofyork deleted the changes_tries_update_configuration branch January 16, 2020 16:38
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@svyatonik@gavofyork@cheme@Demi-Marie@NikVolf@devops-parity