-
Notifications
You must be signed in to change notification settings - Fork 7
feat(linstorvolumemanager): cache controller uri in a file #83
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 3.2.12-8.3
Are you sure you want to change the base?
Conversation
958caec
to
42b42bc
Compare
drivers/linstorvolumemanager.py
Outdated
address = uri.removeprefix("linstor://") | ||
session = util.timeout_call(10, util.get_localAPI_session) | ||
for host_ref, host_record in session.xenapi.host.get_all(): | ||
if host_record.get('address', '') != address: | ||
continue | ||
return util.strtobool( | ||
session.xenapi.host.call_plugin(host_ref, PLUGIN, PLUGIN_CMD, {}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that's necessary here. We can instead do a refactoring of the codebase:
- We will assume that the cache is valid 99% of the time.
- We can directly attempt to create a LINSTOR instance from the URI without checking anything using a plugin. This is the initial idea.
- I think we can implement a new static function on
LinstorVolumeManager
that is used to create an instance of the class using the cached value directly without any checks. If it fails, we rebuild the local cache and try again. This allows us to improve several smapi functions. - There are a few edge cases left with this idea:
- In some places we use the URI to create the journaler (linstor.KV) and to create a linstor object. We could try to use the cached URI without checks again and add a try/catch directly on these specific cases. In case of connection failure, we explicitly request the cache update.
- I see one last edge case concerning the creation of a linstor instance using
get_ips_from_xha_config_file
, we could directly use the function to get the cached URI. In the worst can we can again fallback on the xha config file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good from my POV. Feel free to continue when you have time. :)
42b42bc
to
065e30c
Compare
c315328
to
9760980
Compare
4b663cb
to
363372d
Compare
drivers/linstorvolumemanager.py
Outdated
def get_cached_controller_uri(ctx=None): | ||
try: | ||
with ctx if ctx else shared_reader(CONTROLLER_CACHE_PATH) as f: | ||
return f.read().strip() | ||
except FileNotFoundError: | ||
pass | ||
except Exception as e: | ||
util.SMlog('Unable to read controller URI cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH,e)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
def get_cached_controller_uri(ctx=None): | |
try: | |
with ctx if ctx else shared_reader(CONTROLLER_CACHE_PATH) as f: | |
return f.read().strip() | |
except FileNotFoundError: | |
pass | |
except Exception as e: | |
util.SMlog('Unable to read controller URI cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH,e)) | |
def _read_controller_uri_from_file(f): | |
try: | |
return f.read().strip() | |
except Exception as e: | |
util.SMlog('Unable to read controller URI cache file at `{}`: {}'.format(CONTROLLER_CACHE_PATH, e)) | |
def read_controller_uri_cache(): | |
try: | |
with shared_reader(CONTROLLER_CACHE_PATH) as f: | |
return _read_controller_uri_from_file(f) | |
except FileNotFoundError: | |
pass | |
except Exception as e: | |
util.SMlog('Unable to read controller URI cache file at `{}`: {}'.format(CONTROLLER_CACHE_PATH, e)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 4f84f23
drivers/linstorvolumemanager.py
Outdated
def delete_controller_uri_cache(ctx=None): | ||
try: | ||
with ctx if ctx else excl_writer(CONTROLLER_CACHE_PATH) as f: | ||
f.seek(0) | ||
f.truncate() | ||
except FileNotFoundError: | ||
pass | ||
except Exception as e: | ||
util.SMlog('Unable to delete uri cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH, e)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
def delete_controller_uri_cache(ctx=None): | |
try: | |
with ctx if ctx else excl_writer(CONTROLLER_CACHE_PATH) as f: | |
f.seek(0) | |
f.truncate() | |
except FileNotFoundError: | |
pass | |
except Exception as e: | |
util.SMlog('Unable to delete uri cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH, e)) | |
def delete_controller_uri_cache(): | |
try: | |
with excl_writer(CONTROLLER_CACHE_PATH) as f: | |
f.seek(0) | |
f.truncate() | |
except FileNotFoundError: | |
pass | |
except Exception as e: | |
util.SMlog('Unable to delete URI cache file at `{}`: {}'.format(CONTROLLER_CACHE_PATH, e)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 4f84f23
drivers/linstorvolumemanager.py
Outdated
def write_controller_uri_cache(uri, ctx=None): | ||
try: | ||
if not os.path.exists(CONTROLLER_CACHE_DIRECTORY): | ||
os.makedirs(CONTROLLER_CACHE_DIRECTORY) | ||
os.chmod(CONTROLLER_CACHE_DIRECTORY, 0o700) | ||
with ctx if ctx else excl_writer(CONTROLLER_CACHE_PATH) as f: | ||
f.seek(0) | ||
f.write(uri) | ||
f.truncate() | ||
except FileNotFoundError: | ||
pass | ||
except Exception as e: | ||
util.SMlog('Unable to write URI cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH, e)) | ||
|
||
|
||
def build_controller_uri_cache(): | ||
with excl_writer(CONTROLLER_CACHE_PATH) as f: | ||
uri = get_cached_controller_uri(contextlib.nullcontext(f)) | ||
if uri: | ||
return uri | ||
uri = _get_controller_uri() | ||
if not uri: | ||
for retries in range(9): | ||
time.sleep(1) | ||
uri = _get_controller_uri() | ||
if uri: | ||
break | ||
|
||
retries += 1 | ||
if retries >= 10: | ||
break | ||
time.sleep(1) | ||
if uri: | ||
write_controller_uri_cache(uri, contextlib.nullcontext(f)) | ||
return uri |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cannot add suggestion due to github limitation but:
def build_controller_uri_cache():
uri = ''
try:
with excl_writer(CONTROLLER_CACHE_PATH) as f:
uri = _read_controller_uri_from_file(f)
if uri:
return uri
uri = _get_controller_uri()
if not uri:
for retries in range(9):
time.sleep(1)
uri = _get_controller_uri()
if uri:
break
if uri:
f.seek(0)
f.write(uri)
f.truncate()
except FileNotFoundError:
if os.path.exists(CONTROLLER_CACHE_DIRECTORY):
raise
os.makedirs(CONTROLLER_CACHE_DIRECTORY)
os.chmod(CONTROLLER_CACHE_DIRECTORY, 0o700)
return build_controller_uri_cache()
except Exception as e:
util.SMlog('Unable to write URI cache file at `{}` : {}'.format(CONTROLLER_CACHE_PATH, e))
return uri
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 1f6ffbb
drivers/linstorvolumemanager.py
Outdated
def get_controller_uri(): | ||
uri = get_cached_controller_uri() | ||
if not uri: | ||
uri = build_controller_uri_cache() | ||
return uri |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
def get_controller_uri(): | |
uri = get_cached_controller_uri() | |
if not uri: | |
uri = build_controller_uri_cache() | |
return uri | |
def get_controller_uri(): | |
uri = read_controller_uri_cache() | |
if not uri: | |
uri = build_controller_uri_cache() | |
return uri |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 4f84f23
drivers/linstorvolumemanager.py
Outdated
:param function logger: Function to log messages. | ||
:param int attempt_count: Number of attempts to join the controller. | ||
""" | ||
uri = get_cached_controller_uri() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
uri = get_cached_controller_uri() | |
uri = read_controller_uri_cache() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done in 4f84f23
e7801da
to
ca5b52d
Compare
Co-authored-by: Ronan Abhamon <[email protected]> Co-authored-by: Damien Thenot <[email protected]> Signed-off-by: Mathieu Labourier <[email protected]>
6cdeb37
to
3579d92
Compare
No description provided.