Fix for Python 2.

This commit is contained in:
Itamar Turner-Trauring 2020-10-30 14:34:23 -04:00
parent d52f6747f6
commit 45a2fcc3f2
3 changed files with 52 additions and 16 deletions

View File

@ -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, "

View File

@ -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,

View File

@ -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