Commit 59d136b7 authored by Levin Zimmermann's avatar Levin Zimmermann

client.go: Fix URI client option parsing for supported + unsupported options

Before this patch, the parser ignored options which were already supported
by the client (for instance 'read-only') and even raised an error. But the
client can already use this option: as a9246333 describes this should happen in the
local storage URL parser.

Furthermore not-yet-supported client options (for instance compress) broke
the NEO client before this patch. Now these options only raise a warning which
informs the user that they are ignored. Why? We want to use pre-complete NEO
in real-world projects together with NEO/py clusters. Those real-world projects
may already specify options which aren't supported by our NEO/go client yet.
But it doesn't matters so much, because those options are mostly
relevant for other NEO/py cluster clients (e.g. zope nodes). Instead of
filtering those parameters before parsing them to NEO/go in a higher
level (e.g. SlapOS), NEO/go should already support any valid NEO URL
and raise warnings for not yet implemented features.
parent 2d82ab3c
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
"math/rand" "math/rand"
"net/url" "net/url"
"os" "os"
"strconv"
"strings" "strings"
"sync" "sync"
...@@ -37,6 +38,7 @@ import ( ...@@ -37,6 +38,7 @@ import (
"lab.nexedi.com/kirr/go123/xnet" "lab.nexedi.com/kirr/go123/xnet"
"lab.nexedi.com/kirr/go123/xsync" "lab.nexedi.com/kirr/go123/xsync"
"lab.nexedi.com/kirr/neo/go/internal/log"
"lab.nexedi.com/kirr/neo/go/internal/task" "lab.nexedi.com/kirr/neo/go/internal/task"
taskctx "lab.nexedi.com/kirr/neo/go/internal/xcontext/task" taskctx "lab.nexedi.com/kirr/neo/go/internal/xcontext/task"
"lab.nexedi.com/kirr/neo/go/internal/xurl" "lab.nexedi.com/kirr/neo/go/internal/xurl"
...@@ -477,8 +479,8 @@ func openClientByURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) ( ...@@ -477,8 +479,8 @@ func openClientByURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (
} }
// parseURL extracts information from a NEO URI and puts this information into // parseURL extracts information from a NEO URI and puts this information into
// a NEOUrlInfo. If anything fails within this process an error and an empty // a NEOUrlInfo and the DriverOptions. If anything fails within this process
// NEOUrlInfo are returned. // an error and an empty NEOUrlInfo are returned.
func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo NEOUrlInfo, err error) { func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo NEOUrlInfo, err error) {
// neo(s)://[credentials@]master1,master2,...,masterN/name?options // neo(s)://[credentials@]master1,master2,...,masterN/name?options
...@@ -534,6 +536,27 @@ func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo ...@@ -534,6 +536,27 @@ func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo
return NEOUrlInfo{}, err return NEOUrlInfo{}, err
} }
// mv readonly from URL => driver opts
readOnly, ok := q["read-only"]
if ok {
delete(q, "read-only")
r, err := strconv.ParseBool(readOnly)
if err != nil {
return NEOUrlInfo{}, err
}
opt.ReadOnly = r
}
// pop not yet used client options
// (our neo client doesn't apply their effect yet)
for _, k := range []string {"compress", "cache-size", "logfile"} {
_, ok := q[k]
if ok {
delete(q, k)
log.Warningf(ctx, "TODO client doesn't support option '%q' yet", k)
}
}
if len(q) != 0 { if len(q) != 0 {
return NEOUrlInfo{}, fmt.Errorf("invalid query: %v", q) return NEOUrlInfo{}, fmt.Errorf("invalid query: %v", q)
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment