]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/services/tcmu_service.py
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / pybind / mgr / dashboard / services / tcmu_service.py
1 from dashboard.services.ceph_service import CephService
2 from .. import mgr
3
4 SERVICE_TYPE = 'tcmu-runner'
5
6
7 class TcmuService(object):
8 # pylint: disable=too-many-nested-blocks
9 @staticmethod
10 def get_iscsi_info():
11 daemons = {}
12 images = {}
13 for service in CephService.get_service_list(SERVICE_TYPE):
14 metadata = service['metadata']
15 if metadata is None:
16 continue
17 status = service['status']
18 hostname = service['hostname']
19
20 daemon = daemons.get(hostname, None)
21 if daemon is None:
22 daemon = {
23 'server_hostname': hostname,
24 'version': metadata['ceph_version'],
25 'optimized_paths': 0,
26 'non_optimized_paths': 0
27 }
28 daemons[hostname] = daemon
29
30 service_id = service['id']
31 device_id = service_id.split(':')[-1]
32 image = images.get(device_id)
33 if image is None:
34 image = {
35 'device_id': device_id,
36 'pool_name': metadata['pool_name'],
37 'name': metadata['image_name'],
38 'id': metadata.get('image_id', None),
39 'optimized_paths': [],
40 'non_optimized_paths': []
41 }
42 images[device_id] = image
43
44 if status.get('lock_owner', 'false') == 'true':
45 daemon['optimized_paths'] += 1
46 image['optimized_paths'].append(hostname)
47
48 perf_key_prefix = "librbd-{id}-{pool}-{name}.".format(
49 id=metadata.get('image_id', ''),
50 pool=metadata['pool_name'],
51 name=metadata['image_name'])
52 perf_key = "{}lock_acquired_time".format(perf_key_prefix)
53 lock_acquired_time = (mgr.get_counter(
54 'tcmu-runner', service_id, perf_key)[perf_key]
55 or [[0, 0]])[-1][1] / 1000000000
56 if lock_acquired_time > image.get('optimized_since', 0):
57 image['optimized_daemon'] = hostname
58 image['optimized_since'] = lock_acquired_time
59 image['stats'] = {}
60 image['stats_history'] = {}
61 for s in ['rd', 'wr', 'rd_bytes', 'wr_bytes']:
62 perf_key = "{}{}".format(perf_key_prefix, s)
63 image['stats'][s] = CephService.get_rate(
64 'tcmu-runner', service_id, perf_key)
65 image['stats_history'][s] = CephService.get_rates(
66 'tcmu-runner', service_id, perf_key)
67 else:
68 daemon['non_optimized_paths'] += 1
69 image['non_optimized_paths'].append(hostname)
70
71 # clear up races w/ tcmu-runner clients that haven't detected
72 # loss of optimized path
73 for image in images.values():
74 optimized_daemon = image.get('optimized_daemon', None)
75 if optimized_daemon:
76 for daemon_name in image['optimized_paths']:
77 if daemon_name != optimized_daemon:
78 daemon = daemons[daemon_name]
79 daemon['optimized_paths'] -= 1
80 daemon['non_optimized_paths'] += 1
81 image['non_optimized_paths'].append(daemon_name)
82 image['optimized_paths'] = [optimized_daemon]
83
84 return {
85 'daemons': sorted(daemons.values(),
86 key=lambda d: d['server_hostname']),
87 'images': sorted(images.values(), key=lambda i: ['id']),
88 }
89
90 @staticmethod
91 def get_image_info(pool_name, image_name, get_iscsi_info):
92 for image in get_iscsi_info['images']:
93 if image['pool_name'] == pool_name and image['name'] == image_name:
94 return image
95 return None