Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian
, '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

Error on invalid store mode - #3068

Merged
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode
May 21, 2025
Merged

Error on invalid store mode#3068
dstansby merged 4 commits into
zarr-developers:mainfrom
dstansby:invalid-mode

Conversation

@dstansby

Copy link
Copy Markdown
Contributor

This avoids instances where mode='r' could be passed, by the resulting array is not read-only. Fixes#2949

@github-actionsgithub-actionsBot added needs release notes Automatically applied to PRs which haven't added release notes and removed needs release notes Automatically applied to PRs which haven't added release notes labels May 18, 2025
@dstansby
dstansby marked this pull request as ready for review May 18, 2025 16:27
@dstansbydstansby added this to the 3.0.8 milestone May 19, 2025
@d-v-b

Copy link
Copy Markdown
Contributor

this looks good to me, curious to hear your thoughts @jhamman since you are the mode architect

@dstansby
dstansby enabled auto-merge (squash) May 21, 2025 11:31
@dstansby
dstansby merged commit 481550a into zarr-developers:mainMay 21, 2025
@maxrjones

Copy link
Copy Markdown
Member

Would it be possible instead to provide a UserWarning and return a read-only copy of the store? I'm concerned about the downstream impacts of this change (e.g., see xarray failures reported in #3105 (comment)).

@dstansby
dstansby deleted the invalid-mode branch May 30, 2025 21:01
@dstansby

Copy link
Copy Markdown
ContributorAuthor

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

At a slightly higher level, I don't really understand why arrays can't have their own read/write permissions, but I missed that design decision.

@maxrjones

Copy link
Copy Markdown
Member

My thinking here with an error was to avoid situations where one opened an array with mode='r', but writing to it still worked. So although it has the potential to be disruptive, it's avoiding confusion with the API so I think worth it.

I definitely agree with the premise of avoiding situations where one opened an array with mode='r' but writing still works.

I still question this solution because it will certainly be disruptive. The decision to defer read/write permissions to only the store level is an internal design detail that could be changed without any user facing disruptions, so IMO it'd be better to reconsider that decision before releasing a disruptive change.

IIUC since the array has a reference to the store used at creation rather than a copy, this check doesn't really suffice to solving the situation where one opened an array with mode="r" if the store mode were become mutable (xref #3105). While it seems likely that @d-v-b understands that consequence and is arguing against it, a separate array mode would protect against store changes badly influencing array behavior in a more robust way.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

We should decide one way or another before doing a 3.0.9 release. I'm still minded to go ahead with this, but expand the error message to say to open the store in read only mode if you want to open an array in read only mode. I'd also like to look at the xarray test failures, to see if there's an easy fix, or if there is a sensible use case that we're breaking with this change.

So before we release 3.0.9 with this, I think the todo is:

@maxrjones does that sound good? Anything I missed? Thanks for the downstream testing, it helps a lot!

@dstansby

Copy link
Copy Markdown
ContributorAuthor

Okay, I had a poke around at pydata/xarray#10430, and convinced myself that we should revert this change for now. Long term we really need to sort out the complete mess of permissions and work out what our permission model actually is...

@d-v-b

Copy link
Copy Markdown
Contributor

for posterity can you elaborate a bit more on how the linked xarray PR convinced you to revert?

dstansby added a commit to dstansby/zarr-python that referenced this pull request Jun 18, 2025
@dstansby

Copy link
Copy Markdown
ContributorAuthor

In the xarray tests, there are examples where they create a memory store that is not read only, write an array to it, and then try and open that array in read only mode. I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

@d-v-b

Copy link
Copy Markdown
Contributor

an alternative solution would be to go with ##3138 and modify xarray to use that method as needed. I'd be curious to hear the pros / cons for the revert solution vs the "add functionality" solution.

@dstansby

Copy link
Copy Markdown
ContributorAuthor

My sense is #3138 is a bit of a hack anyway, when it should be possible to open an array in read-only mode from a writeable store. Because no-one did a write up (?) of the permission model changes for zarr-python v3 I don't really understand whether this is deliberately not possible, or if it was just an oversight.

@d-v-b

Copy link
Copy Markdown
Contributor

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

@maxrjones

Copy link
Copy Markdown
Member

it should be possible to open an array in read-only mode from a writeable store.

This is the key question. In Zarr-python 2 arrays and groups had a permission model. But in Zarr-python 3, we expressly moved the permissions model to the storage level, and so arrays / groups have defer entirely to the store for that. If we stick with that decision, then it should not be possible to open an array in read-only mode from a writeable store, without creating a new read-only version of that store (which #3138 implements).

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class). This would balance matching the store mode with the API call and avoiding breaking changes. What would be the downsides of that approach?

@dstansby

Copy link
Copy Markdown
ContributorAuthor

👍 that sounds like a good approach to me - I'd even consider not warning and just silently returning a copy.

How shall we move forward then? Should we roll that change into #3138?

@dcherian

Copy link
Copy Markdown
Contributor

I think it's reasonable to ask for a read only array from a writeable store, and not be able to write to the array.

Yes. for example I'd like to read from array a and write to another array b in the same store, and have some protections around not writing to a.

Rather than erroring on invalid store mode, we could emit a warning and create a copy of the store in the specified mode using #3138 (if implemented in the store class).

👍 great idea!

@maxrjones

Copy link
Copy Markdown
Member

How shall we move forward then? Should we roll that change into #3138?

I can update #3138 to add with_read_only() to the other store classes as the first step. To keep PRs well-constrained, I think it would work well for you to either modify #3145 to use with_read_only() as the second step or someone does that as a different PR after #3138 is finished/reviewed/merged.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Array.read_only incorrect

4 participants

@dstansby@d-v-b@maxrjones@dcherian