mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-01-19 03:06:33 +00:00
Fix for Python 2.
This commit is contained in:
parent
d52f6747f6
commit
45a2fcc3f2
@ -65,6 +65,8 @@ from allmydata.util.assertutil import precondition
|
|||||||
from allmydata.util.observer import ObserverList
|
from allmydata.util.observer import ObserverList
|
||||||
from allmydata.util.rrefutil import add_version_to_remote_reference
|
from allmydata.util.rrefutil import add_version_to_remote_reference
|
||||||
from allmydata.util.hashutil import permute_server_hash
|
from allmydata.util.hashutil import permute_server_hash
|
||||||
|
from allmydata.util.dictutil import BytesKeyDict
|
||||||
|
|
||||||
|
|
||||||
# who is responsible for de-duplication?
|
# who is responsible for de-duplication?
|
||||||
# both?
|
# both?
|
||||||
@ -92,7 +94,7 @@ class StorageClientConfig(object):
|
|||||||
decreasing preference. See the *[client]peers.preferred*
|
decreasing preference. See the *[client]peers.preferred*
|
||||||
documentation for details.
|
documentation for details.
|
||||||
|
|
||||||
:ivar dict[unicode, dict[bytes, bytes]] storage_plugins: A mapping from
|
:ivar dict[unicode, dict[unicode, unicode]] storage_plugins: A mapping from
|
||||||
names of ``IFoolscapStoragePlugin`` configured in *tahoe.cfg* to the
|
names of ``IFoolscapStoragePlugin`` configured in *tahoe.cfg* to the
|
||||||
respective configuration.
|
respective configuration.
|
||||||
"""
|
"""
|
||||||
@ -107,24 +109,24 @@ class StorageClientConfig(object):
|
|||||||
|
|
||||||
:param _Config config: The loaded Tahoe-LAFS node configuration.
|
:param _Config config: The loaded Tahoe-LAFS node configuration.
|
||||||
"""
|
"""
|
||||||
ps = config.get_config("client", "peers.preferred", b"").split(b",")
|
ps = config.get_config("client", "peers.preferred", "").split(",")
|
||||||
preferred_peers = tuple([p.strip() for p in ps if p != b""])
|
preferred_peers = tuple([p.strip() for p in ps if p != ""])
|
||||||
|
|
||||||
enabled_storage_plugins = (
|
enabled_storage_plugins = (
|
||||||
name.strip()
|
name.strip()
|
||||||
for name
|
for name
|
||||||
in config.get_config(
|
in config.get_config(
|
||||||
b"client",
|
"client",
|
||||||
b"storage.plugins",
|
"storage.plugins",
|
||||||
b"",
|
"",
|
||||||
).decode("utf-8").split(u",")
|
).split(u",")
|
||||||
if name.strip()
|
if name.strip()
|
||||||
)
|
)
|
||||||
|
|
||||||
storage_plugins = {}
|
storage_plugins = {}
|
||||||
for plugin_name in enabled_storage_plugins:
|
for plugin_name in enabled_storage_plugins:
|
||||||
try:
|
try:
|
||||||
plugin_config = config.items(b"storageclient.plugins." + plugin_name)
|
plugin_config = config.items("storageclient.plugins." + plugin_name)
|
||||||
except NoSectionError:
|
except NoSectionError:
|
||||||
plugin_config = []
|
plugin_config = []
|
||||||
storage_plugins[plugin_name] = dict(plugin_config)
|
storage_plugins[plugin_name] = dict(plugin_config)
|
||||||
@ -173,7 +175,7 @@ class StorageFarmBroker(service.MultiService):
|
|||||||
# storage servers that we've heard about. Each descriptor manages its
|
# storage servers that we've heard about. Each descriptor manages its
|
||||||
# own Reconnector, and will give us a RemoteReference when we ask
|
# own Reconnector, and will give us a RemoteReference when we ask
|
||||||
# them for it.
|
# them for it.
|
||||||
self.servers = {}
|
self.servers = BytesKeyDict()
|
||||||
self._static_server_ids = set() # ignore announcements for these
|
self._static_server_ids = set() # ignore announcements for these
|
||||||
self.introducer_client = None
|
self.introducer_client = None
|
||||||
self._threshold_listeners = [] # tuples of (threshold, Deferred)
|
self._threshold_listeners = [] # tuples of (threshold, Deferred)
|
||||||
@ -198,8 +200,10 @@ class StorageFarmBroker(service.MultiService):
|
|||||||
# written tests will still fail if a surprising exception
|
# written tests will still fail if a surprising exception
|
||||||
# arrives here but they might be harder to debug without this
|
# arrives here but they might be harder to debug without this
|
||||||
# information.
|
# information.
|
||||||
pass
|
raise
|
||||||
else:
|
else:
|
||||||
|
if isinstance(server_id, unicode):
|
||||||
|
server_id = server_id.encode("utf-8")
|
||||||
self._static_server_ids.add(server_id)
|
self._static_server_ids.add(server_id)
|
||||||
self.servers[server_id] = storage_server
|
self.servers[server_id] = storage_server
|
||||||
storage_server.setServiceParent(self)
|
storage_server.setServiceParent(self)
|
||||||
@ -555,7 +559,7 @@ class _FoolscapStorage(object):
|
|||||||
if isinstance(seed, unicode):
|
if isinstance(seed, unicode):
|
||||||
seed = seed.encode("utf-8")
|
seed = seed.encode("utf-8")
|
||||||
ps = base32.a2b(seed)
|
ps = base32.a2b(seed)
|
||||||
elif re.search(r'^v0-[0-9a-zA-Z]{52}$', server_id):
|
elif re.search(br'^v0-[0-9a-zA-Z]{52}$', server_id):
|
||||||
ps = base32.a2b(server_id[3:])
|
ps = base32.a2b(server_id[3:])
|
||||||
else:
|
else:
|
||||||
log.msg("unable to parse serverid '%(server_id)s as pubkey, "
|
log.msg("unable to parse serverid '%(server_id)s as pubkey, "
|
||||||
|
@ -504,14 +504,14 @@ class TestStorageFarmBroker(unittest.TestCase):
|
|||||||
def test_static_servers(self):
|
def test_static_servers(self):
|
||||||
broker = make_broker()
|
broker = make_broker()
|
||||||
|
|
||||||
key_s = 'v0-1234-1'
|
key_s = b'v0-1234-1'
|
||||||
servers_yaml = """\
|
servers_yaml = """\
|
||||||
storage:
|
storage:
|
||||||
v0-1234-1:
|
v0-1234-1:
|
||||||
ann:
|
ann:
|
||||||
anonymous-storage-FURL: {furl}
|
anonymous-storage-FURL: {furl}
|
||||||
permutation-seed-base32: aaaaaaaaaaaaaaaaaaaaaaaa
|
permutation-seed-base32: aaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
""".format(furl=SOME_FURL)
|
""".format(furl=SOME_FURL.decode("utf-8"))
|
||||||
servers = yamlutil.safe_load(servers_yaml)
|
servers = yamlutil.safe_load(servers_yaml)
|
||||||
permseed = base32.a2b(b"aaaaaaaaaaaaaaaaaaaaaaaa")
|
permseed = base32.a2b(b"aaaaaaaaaaaaaaaaaaaaaaaa")
|
||||||
broker.set_static_servers(servers["storage"])
|
broker.set_static_servers(servers["storage"])
|
||||||
@ -527,7 +527,7 @@ storage:
|
|||||||
|
|
||||||
ann2 = {
|
ann2 = {
|
||||||
"service-name": "storage",
|
"service-name": "storage",
|
||||||
"anonymous-storage-FURL": "pb://{}@nowhere/fake2".format(base32.b2a(str(1))),
|
"anonymous-storage-FURL": "pb://{}@nowhere/fake2".format(base32.b2a(b"1")),
|
||||||
"permutation-seed-base32": "bbbbbbbbbbbbbbbbbbbbbbbb",
|
"permutation-seed-base32": "bbbbbbbbbbbbbbbbbbbbbbbb",
|
||||||
}
|
}
|
||||||
broker._got_announcement(key_s, ann2)
|
broker._got_announcement(key_s, ann2)
|
||||||
@ -538,7 +538,7 @@ storage:
|
|||||||
def test_static_permutation_seed_pubkey(self):
|
def test_static_permutation_seed_pubkey(self):
|
||||||
broker = make_broker()
|
broker = make_broker()
|
||||||
server_id = b"v0-4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
server_id = b"v0-4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
||||||
k = "4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
k = b"4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
||||||
ann = {
|
ann = {
|
||||||
"anonymous-storage-FURL": SOME_FURL,
|
"anonymous-storage-FURL": SOME_FURL,
|
||||||
}
|
}
|
||||||
@ -549,7 +549,7 @@ storage:
|
|||||||
def test_static_permutation_seed_explicit(self):
|
def test_static_permutation_seed_explicit(self):
|
||||||
broker = make_broker()
|
broker = make_broker()
|
||||||
server_id = b"v0-4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
server_id = b"v0-4uazse3xb6uu5qpkb7tel2bm6bpea4jhuigdhqcuvvse7hugtsia"
|
||||||
k = "w5gl5igiexhwmftwzhai5jy2jixn7yx7"
|
k = b"w5gl5igiexhwmftwzhai5jy2jixn7yx7"
|
||||||
ann = {
|
ann = {
|
||||||
"anonymous-storage-FURL": SOME_FURL,
|
"anonymous-storage-FURL": SOME_FURL,
|
||||||
"permutation-seed-base32": k,
|
"permutation-seed-base32": k,
|
||||||
|
@ -14,6 +14,7 @@ if PY2:
|
|||||||
# subclassing dict, so we'd end up exposing Python 3 dict APIs to lots of
|
# subclassing dict, so we'd end up exposing Python 3 dict APIs to lots of
|
||||||
# code that doesn't support it.
|
# code that doesn't support it.
|
||||||
from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, list, object, range, str, max, min # noqa: F401
|
from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, list, object, range, str, max, min # noqa: F401
|
||||||
|
from six import ensure_str
|
||||||
|
|
||||||
|
|
||||||
class DictOfSets(dict):
|
class DictOfSets(dict):
|
||||||
@ -76,3 +77,34 @@ class AuxValueDict(dict):
|
|||||||
have an auxvalue."""
|
have an auxvalue."""
|
||||||
super(AuxValueDict, self).__setitem__(key, value)
|
super(AuxValueDict, self).__setitem__(key, value)
|
||||||
self.auxilliary[key] = auxilliary
|
self.auxilliary[key] = auxilliary
|
||||||
|
|
||||||
|
|
||||||
|
class _TypedKeyDict(dict):
|
||||||
|
"""Dictionary that enforces key type.
|
||||||
|
|
||||||
|
Doesn't override everything, but probably good enough to catch most
|
||||||
|
problems.
|
||||||
|
|
||||||
|
Subclass and override KEY_TYPE.
|
||||||
|
"""
|
||||||
|
|
||||||
|
KEY_TYPE = object
|
||||||
|
|
||||||
|
|
||||||
|
def _make_enforcing_override(K, method_name):
|
||||||
|
def f(self, key, *args, **kwargs):
|
||||||
|
assert isinstance(key, self.KEY_TYPE)
|
||||||
|
return getattr(dict, method_name)(self, key, *args, **kwargs)
|
||||||
|
f.__name__ = ensure_str(method_name)
|
||||||
|
setattr(K, method_name, f)
|
||||||
|
|
||||||
|
for _method_name in ["__setitem__", "__getitem__", "setdefault", "get",
|
||||||
|
"__delitem__"]:
|
||||||
|
_make_enforcing_override(_TypedKeyDict, _method_name)
|
||||||
|
del _method_name
|
||||||
|
|
||||||
|
|
||||||
|
class BytesKeyDict(_TypedKeyDict):
|
||||||
|
"""Keys should be bytes."""
|
||||||
|
|
||||||
|
KEY_TYPE = bytes
|
||||||
|
Loading…
Reference in New Issue
Block a user