Skip to content

Commit e6f96d4

Browse files
authored
Switch tests to the new tablet service (#8454)
1 parent 3ba7187 commit e6f96d4

File tree

6 files changed

+91
-65
lines changed

6 files changed

+91
-65
lines changed

ydb/tests/acceptance/cluster.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ grpc:
117117
- cms
118118
- discovery
119119
- legacy
120+
- tablet_service
120121
- experimental
121122
- pq
122123
- clickhouse_internal

ydb/tests/functional/hive/test_kill_tablets.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from ydb.tests.library.common.delayed import wait_tablets_state_by_id
55
from ydb.tests.library.common.types import TabletTypes, TabletStates
66
from ydb.tests.library.harness.kikimr_cluster import kikimr_cluster_factory
7-
from ydb.tests.library.matchers.response import is_ok_response, is_valid_response_with_field
7+
from ydb.tests.library.matchers.response import is_valid_response_with_field
88
from ydb.tests.library.kv.helpers import create_tablets_and_wait_for_start
99

1010
TIMEOUT_SECONDS = 180
@@ -51,11 +51,7 @@ def test_when_kill_hive_it_will_be_restarted_and_can_create_tablets(self):
5151
hive_id = hive_state_response.TabletStateInfo[0].TabletId
5252

5353
# Act
54-
response = self.cluster.client.tablet_kill(hive_id)
55-
assert_that(
56-
response,
57-
is_ok_response()
58-
)
54+
self.cluster.client.tablet_kill(hive_id, assert_success=True)
5955

6056
wait_tablets_state_by_id(
6157
self.cluster.client,

ydb/tests/library/common/local_db_scheme.py

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
3-
import ydb.core.protos.msgbus_pb2 as msgbus
4-
from ydb.tests.library.common.types import DeltaTypes, PType
3+
import json
4+
from ydb.public.api.protos.ydb_status_codes_pb2 import StatusIds
5+
from ydb.public.api.protos.draft.ydb_tablet_pb2 import ChangeTabletSchemaRequest
6+
from ydb.tests.library.common.types import PType
57

68

79
def column_to_dict(delta):
810
return {
9-
"ColumnId": delta.ColumnId,
10-
"ColumnName": delta.ColumnName,
11+
"ColumnId": delta['column_id'],
12+
"ColumnName": delta['column_name'],
1113
"ColumnType": str(
12-
PType.from_int(delta.ColumnType)
14+
PType.from_int(delta['column_type'])
1315
)
1416
}
1517

@@ -35,8 +37,8 @@ def drop_column(self, delta):
3537
return self
3638

3739
def add_column_to_family(self, delta):
38-
cid = delta.ColumnId
39-
fid = delta.FamilyId
40+
cid = delta['column_id']
41+
fid = delta['family_id']
4042

4143
if fid not in self.data['ColumnFamilies']:
4244
raise RuntimeError("Unknown family")
@@ -45,8 +47,8 @@ def add_column_to_family(self, delta):
4547
return self
4648

4749
def add_family(self, delta):
48-
fid = delta.FamilyId
49-
rid = delta.RoomId
50+
fid = delta['family_id']
51+
rid = delta['room_id']
5052

5153
if rid not in self.data['Rooms']:
5254
raise RuntimeError("Unknown room")
@@ -67,25 +69,25 @@ def add_family(self, delta):
6769
return self
6870

6971
def set_family(self, delta):
70-
fid = delta.FamilyId
72+
fid = delta['family_id']
7173

7274
if fid not in self.data['ColumnFamilies']:
7375
raise RuntimeError("Unknown family")
7476

75-
if hasattr(delta, 'Codec') and delta.Codec is not None:
76-
self.data['ColumnFamilies'][fid]['Codec'] = delta.Codec
77+
if 'codec' in delta and delta['codec'] is not None:
78+
self.data['ColumnFamilies'][fid]['Codec'] = delta['codec']
7779

78-
if hasattr(delta, 'InMemory') and delta.InMemory is not None:
79-
self.data['ColumnFamilies'][fid]['InMemory'] = delta.InMemory
80+
if 'in_memory' in delta and delta['in_memory'] is not None:
81+
self.data['ColumnFamilies'][fid]['InMemory'] = delta['in_memory']
8082

81-
if hasattr(delta, 'Cache') and delta.Cache is not None:
82-
self.data['ColumnFamilies'][fid]['Cache'] = delta.Cache
83+
if 'cache' in delta and delta['cache'] is not None:
84+
self.data['ColumnFamilies'][fid]['Cache'] = delta['cache']
8385

84-
if hasattr(delta, 'Small') and delta.Small is not None:
85-
self.data['ColumnFamilies'][fid]['Small'] = delta.Small
86+
if 'small' in delta and delta['small'] is not None:
87+
self.data['ColumnFamilies'][fid]['Small'] = delta['small']
8688

87-
if hasattr(delta, 'Large') and delta.Large is not None:
88-
self.data['ColumnFamilies'][fid]['Large'] = delta.Large
89+
if 'large' in delta and delta['large'] is not None:
90+
self.data['ColumnFamilies'][fid]['Large'] = delta['large']
8991

9092
return self
9193

@@ -102,15 +104,15 @@ def Rooms(self):
102104
return self.data['Rooms']
103105

104106
def add_column_to_key(self, delta):
105-
cid = delta.ColumnId
107+
cid = delta['column_id']
106108
self.data['TableKey'].append(cid)
107109
return self
108110

109111
def unknown_delta(self, delta):
110112
raise RuntimeError("Unknown delta type")
111113

112114
def set_room(self, delta):
113-
self.data['Rooms'][delta.RoomId] = {"Main": delta.Main, "Outer": delta.Outer, "Blobs": delta.Blobs}
115+
self.data['Rooms'][delta['room_id']] = {"Main": delta['main'], "Outer": delta['outer'], "Blobs": delta['blobs']}
114116
return self
115117

116118
def set_compaction_policy(self, delta):
@@ -123,23 +125,27 @@ def set_table(self, delta):
123125

124126
def add_delta(self, delta):
125127
mapping = {
126-
DeltaTypes.AddColumn: self.add_column,
127-
DeltaTypes.DropColumn: self.drop_column,
128-
DeltaTypes.AddColumnToKey: self.add_column_to_key,
129-
DeltaTypes.AddColumnToFamily: self.add_column_to_family,
130-
DeltaTypes.AddFamily: self.add_family,
131-
DeltaTypes.SetRoom: self.set_room,
132-
DeltaTypes.SetCompactionPolicy: self.set_compaction_policy,
133-
DeltaTypes.SetFamily: self.set_family,
134-
DeltaTypes.SetTable: self.set_table,
128+
'AddColumn': self.add_column,
129+
'DropColumn': self.drop_column,
130+
'AddColumnToKey': self.add_column_to_key,
131+
'AddColumnToFamily': self.add_column_to_family,
132+
'AddFamily': self.add_family,
133+
'SetRoom': self.set_room,
134+
'SetCompactionPolicy': self.set_compaction_policy,
135+
'SetFamily': self.set_family,
136+
'SetTable': self.set_table,
135137
}
136-
op = mapping.get(delta.DeltaType, self.unknown_delta)
138+
op = mapping.get(delta['delta_type'], self.unknown_delta)
137139
return op(delta)
138140

139141

140142
def get_deltas(client, tablet_id):
141-
resp = client.send_request(msgbus.TLocalSchemeTx(TabletID=tablet_id, Timeout=60 * 1000), method='LocalSchemeTx')
142-
return resp.LocalDbScheme.Delta
143+
resp = client.tablet_service.ChangeTabletSchema(ChangeTabletSchemaRequest(tablet_id=tablet_id))
144+
assert resp.status == StatusIds.SUCCESS
145+
if resp.status != StatusIds.SUCCESS:
146+
raise RuntimeError('ERROR: {status} {issues}'.format(status=resp.status, issues=resp.issues))
147+
schema = json.loads(resp.schema)
148+
return schema['delta']
143149

144150

145151
def get_scheme(client, tablet_id):
@@ -148,15 +154,15 @@ def get_scheme(client, tablet_id):
148154
pos = {}
149155

150156
for delta in deltas:
151-
if not delta.HasField('TableId'):
157+
if 'table_id' not in delta:
152158
continue
153159

154-
if delta.DeltaType == DeltaTypes.AddTable:
155-
table = TableScheme(delta.TableId, delta.TableName)
156-
pos[delta.TableId] = len(scheme)
160+
if delta['delta_type'] == 'AddTable':
161+
table = TableScheme(delta['table_id'], delta['table_name'])
162+
pos[delta['table_id']] = len(scheme)
157163
scheme.append(table)
158164
continue
159165

160-
scheme[pos[delta.TableId]] = scheme[pos[delta.TableId]].add_delta(delta)
166+
scheme[pos[delta['table_id']]] = scheme[pos[delta['table_id']]].add_delta(delta)
161167

162168
return [element for element in scheme]

ydb/tests/library/common/types.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,6 @@
77
from ydb.tests.library.common.generators import int_between, one_of, float_in, string_with_length, actor_id
88

99

10-
@unique
11-
class DeltaTypes(IntEnum):
12-
AddTable = 1,
13-
DropTable = 2,
14-
AddColumn = 3,
15-
DropColumn = 4,
16-
AddColumnToKey = 5,
17-
AddColumnToFamily = 6,
18-
AddFamily = 7,
19-
UpdateExecutorInfo = 8,
20-
SetCompactionPolicy = 9,
21-
SetRoom = 10,
22-
SetFamily = 11,
23-
SetRedo = 12,
24-
SetTable = 13
25-
26-
2710
@unique
2811
class PDiskCategory(IntEnum):
2912
ROT = 0

ydb/tests/library/harness/kikimr_client.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import grpc
1010
import six
11+
import functools
1112

1213
from google.protobuf.text_format import Parse
1314
from ydb.core.protos import blobstorage_config_pb2
@@ -17,6 +18,8 @@
1718
import ydb.core.protos.grpc_pb2_grpc as grpc_server
1819
from ydb.core.protos import flat_scheme_op_pb2 as flat_scheme_op
1920
from ydb.public.api.protos.ydb_status_codes_pb2 import StatusIds
21+
from ydb.public.api.grpc.draft import ydb_tablet_v1_pb2_grpc as grpc_tablet_service
22+
from ydb.public.api.protos.draft.ydb_tablet_pb2 import RestartTabletRequest
2023
from collections import namedtuple
2124

2225

@@ -52,6 +55,36 @@ def to_bytes(v):
5255
return v
5356

5457

58+
class StubWithRetries(object):
59+
__slots__ = ('_stub', '_retry_count', '_retry_min_sleep', '_retry_max_sleep', '__dict__')
60+
61+
def __init__(self, stub, retry_count=4, retry_min_sleep=0.1, retry_max_sleep=5):
62+
self._stub = stub
63+
self._retry_count = retry_count
64+
self._retry_min_sleep = retry_min_sleep
65+
self._retry_max_sleep = retry_max_sleep
66+
67+
def __getattr__(self, method):
68+
target = getattr(self._stub, method)
69+
70+
@functools.wraps(target)
71+
def wrapper(*args, **kwargs):
72+
retries = self._retry_count
73+
next_sleep = self._retry_min_sleep
74+
while True:
75+
try:
76+
return target(*args, **kwargs)
77+
except (RuntimeError, grpc.RpcError):
78+
retries -= 1
79+
if retries <= 0:
80+
raise
81+
time.sleep(next_sleep)
82+
next_sleep = min(next_sleep * 2, self._retry_max_sleep)
83+
84+
setattr(self, method, wrapper)
85+
return wrapper
86+
87+
5588
class KiKiMRMessageBusClient(object):
5689
def __init__(self, server, port, cluster=None, retry_count=1):
5790
self.server = server
@@ -66,6 +99,7 @@ def __init__(self, server, port, cluster=None, retry_count=1):
6699
]
67100
self._channel = grpc.insecure_channel("%s:%s" % (self.server, self.port), options=self._options)
68101
self._stub = grpc_server.TGRpcServerStub(self._channel)
102+
self.tablet_service = StubWithRetries(grpc_tablet_service.TabletServiceStub(self._channel))
69103

70104
def describe(self, path, token):
71105
request = msgbus.TSchemeDescribe()
@@ -350,9 +384,14 @@ def kv_request(self, tablet_id, kv_request, generation=None, deadline_ms=None):
350384
request.DeadlineInstantMs = deadline_ms
351385
return self.invoke(request, 'KeyValue')
352386

353-
def tablet_kill(self, tablet_id):
354-
request = msgbus.TTabletKillRequest(TabletID=tablet_id)
355-
return self.invoke(request, 'TabletKillRequest')
387+
def tablet_kill(self, tablet_id, assert_success=False):
388+
request = RestartTabletRequest(tablet_id=tablet_id)
389+
response = self.tablet_service.RestartTablet(request)
390+
if assert_success:
391+
assert response.status == StatusIds.SUCCESS
392+
if response.status != StatusIds.SUCCESS:
393+
raise RuntimeError('ERROR: {status} {issues}'.format(status=response.status, issues=response.issues))
394+
return response
356395

357396
def tablet_state(self, tablet_type=None, tablet_ids=()):
358397
request = msgbus.TTabletStateRequest()

ydb/tests/library/harness/resources/default_yaml.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ grpc_config:
134134
host: "{ydb_grpc_host}"
135135
services:
136136
- "legacy"
137+
- "tablet_service"
137138
- "yql"
138139
- "discovery"
139140
- "cms"

0 commit comments

Comments
 (0)