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 (
"math/rand"
"net/url"
"os"
"strconv"
"strings"
"sync"
......@@ -37,6 +38,7 @@ import (
"lab.nexedi.com/kirr/go123/xnet"
"lab.nexedi.com/kirr/go123/xsync"
"lab.nexedi.com/kirr/neo/go/internal/log"
"lab.nexedi.com/kirr/neo/go/internal/task"
taskctx "lab.nexedi.com/kirr/neo/go/internal/xcontext/task"
"lab.nexedi.com/kirr/neo/go/internal/xurl"
......@@ -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
// a NEOUrlInfo. If anything fails within this process an error and an empty
// NEOUrlInfo are returned.
// a NEOUrlInfo and the DriverOptions. If anything fails within this process
// an error and an empty NEOUrlInfo are returned.
func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo NEOUrlInfo, err error) {
// neo(s)://[credentials@]master1,master2,...,masterN/name?options
......@@ -534,6 +536,27 @@ func parseURL(ctx context.Context, u *url.URL, opt *zodb.DriverOptions) (urlinfo
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 {
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