Skip to content

Commit 115ee0b

Browse files
authored
Fix version mismatch between kubernetes and minikube (#2986)
1 parent a71d9fb commit 115ee0b

File tree

3 files changed

+98
-29
lines changed

3 files changed

+98
-29
lines changed

.github/workflows/install-minikube.sh

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,10 @@ export CHANGE_MINIKUBE_NONE_USER=true
55
sudo apt-get -q update || true
66
sudo apt-get install -yq conntrack jq
77

8-
get_latest_release() {
9-
curl --silent "https://api.github.com/repos/$1/releases" |
10-
jq -c '[.[] | select(.prerelease == false)][0].tag_name' |
11-
sed -E 's/.*"([^"]+)".*/\1/'
12-
}
13-
14-
K8S_VERSION=$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)
15-
if [[ "$K8S_VERSION" == *"alpha"* ]] || [[ "$K8S_VERSION" == *"beta"* ]] || [[ "$K8S_VERSION" == *"rc"* ]]; then
16-
K8S_VERSION=$(get_latest_release "kubernetes/kubernetes")
17-
fi
18-
19-
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$K8S_VERSION/bin/linux/amd64/kubectl && \
20-
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
21-
228
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && \
239
chmod +x minikube && sudo mv minikube /usr/local/bin/
2410

25-
sudo minikube start --vm-driver=none --kubernetes-version=$K8S_VERSION
11+
sudo minikube start --vm-driver=none
2612
export KUBECONFIG=$HOME/.kube/config
2713
sudo cp -R /root/.kube /root/.minikube $HOME/
2814
sudo chown -R $(id -u):$(id -g) $HOME/.kube $HOME/.minikube
@@ -32,6 +18,10 @@ mv tmp $KUBECONFIG
3218

3319
minikube update-context
3420

21+
K8S_VERSION=$(minikube kubectl -- version --client --output='json' | jq -r '.clientVersion.gitVersion')
22+
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$K8S_VERSION/bin/linux/amd64/kubectl && \
23+
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
24+
3525
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'
3626
until kubectl get nodes -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do
3727
sleep 1
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# Copyright 1999-2022 Alibaba Group Holding Ltd.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
import numpy as np
16+
import pandas as pd
17+
18+
from mars.core import OutputType
19+
from mars.core.operand import Operand
20+
from mars.serialization.serializables import (
21+
Int64Field,
22+
Float64Field,
23+
ListField,
24+
DataTypeField,
25+
SeriesField,
26+
NDArrayField,
27+
StringField,
28+
FieldTypes,
29+
)
30+
from mars.tensor.operands import TensorOperandMixin
31+
from mars.utils import tokenize
32+
33+
34+
class MockOperand(Operand, TensorOperandMixin):
35+
_op_code_ = 102345
36+
37+
str_field = StringField("str_field")
38+
int_field = Int64Field("int_field")
39+
float_field = Float64Field("float_field")
40+
dtype_field = DataTypeField("dtype_field")
41+
series_field = SeriesField("series_field")
42+
ndarray_field = NDArrayField("ndarray_field")
43+
int_list_field = ListField("int_list_field", field_type=FieldTypes.int64)
44+
float_list_field = ListField("float_list_field", field_type=FieldTypes.float64)
45+
str_list_field = ListField("str_list_field", field_type=FieldTypes.string)
46+
47+
48+
class TokenizeOperandSuite:
49+
def setup(self):
50+
chunks = []
51+
for idx in range(1000):
52+
op = MockOperand(
53+
str_field="abcd" * 1024,
54+
int_field=idx,
55+
float_field=float(idx) * 1.42,
56+
dtype_field=np.dtype("<M8"),
57+
series_field=pd.Series([np.dtype(int)] * 1024, name="dtype"),
58+
ndarray_field=np.random.rand(1000),
59+
int_list_field=np.random.randint(0, 1000, size=(1000,)).tolist(),
60+
float_list_field=np.random.rand(1000).tolist(),
61+
str_list_field=[str(i * 2.8571) for i in range(100)],
62+
)
63+
chunks.append(op.new_chunk([], output_type=OutputType.tensor))
64+
self.test_data = chunks
65+
66+
def time_tokenize(self):
67+
tokenize(self.test_data)
68+
69+
70+
if __name__ == "__main__":
71+
suite = TokenizeOperandSuite()
72+
suite.setup()
73+
suite.time_tokenize()

mars/_utils.pyx

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,14 @@ def tokenize_int(*args, **kwargs):
152152
cdef class Tokenizer(TypeDispatcher):
153153
def __call__(self, object obj, *args, **kwargs):
154154
try:
155-
return super().__call__(obj, *args, **kwargs)
155+
return self.get_handler(type(obj))(obj, *args, **kwargs)
156156
except KeyError:
157157
if hasattr(obj, '__mars_tokenize__') and not isinstance(obj, type):
158158
if len(args) == 0 and len(kwargs) == 0:
159159
return obj.__mars_tokenize__()
160160
else:
161-
return super().__call__(obj.__mars_tokenize__(), *args, **kwargs)
161+
obj = obj.__mars_tokenize__()
162+
return self.get_handler(type(obj))(obj, *args, **kwargs)
162163
if callable(obj):
163164
if PDTick is not None and not isinstance(obj, PDTick):
164165
return tokenize_function(obj)
@@ -176,14 +177,20 @@ cdef inline list iterative_tokenize(object ob):
176177
while dq_pos < len(dq):
177178
x = dq[dq_pos]
178179
dq_pos += 1
179-
if isinstance(x, (list, tuple)):
180+
if type(x) in _primitive_types:
181+
h_list.append(x)
182+
elif isinstance(x, (list, tuple)):
180183
dq.extend(x)
181184
elif isinstance(x, set):
182185
dq.extend(sorted(x))
183186
elif isinstance(x, dict):
184187
dq.extend(sorted(x.items()))
185188
else:
186189
h_list.append(tokenize_handler(x))
190+
191+
if dq_pos >= 64 and len(dq) < dq_pos * 2: # pragma: no cover
192+
dq = dq[dq_pos:]
193+
dq_pos = 0
187194
return h_list
188195

189196

@@ -202,20 +209,20 @@ cdef inline tuple tokenize_numpy(ob):
202209
ob.shape, ob.strides, offset)
203210
if ob.dtype.hasobject:
204211
try:
205-
data = mmh_hash_bytes('-'.join(ob.flat).encode('utf-8', errors='surrogatepass')).hex()
212+
data = mmh_hash_bytes('-'.join(ob.flat).encode('utf-8', errors='surrogatepass'))
206213
except UnicodeDecodeError:
207-
data = mmh_hash_bytes(b'-'.join([to_binary(x) for x in ob.flat])).hex()
214+
data = mmh_hash_bytes(b'-'.join([to_binary(x) for x in ob.flat]))
208215
except TypeError:
209216
try:
210-
data = mmh_hash_bytes(pickle.dumps(ob, pickle.HIGHEST_PROTOCOL)).hex()
217+
data = mmh_hash_bytes(pickle.dumps(ob, pickle.HIGHEST_PROTOCOL))
211218
except:
212219
# nothing can do, generate uuid
213220
data = uuid.uuid4().hex
214221
else:
215222
try:
216-
data = mmh_hash_bytes(ob.ravel().view('i1').data).hex()
223+
data = mmh_hash_bytes(ob.ravel().view('i1').data)
217224
except (BufferError, AttributeError, ValueError):
218-
data = mmh_hash_bytes(ob.copy().ravel().view('i1').data).hex()
225+
data = mmh_hash_bytes(ob.copy().ravel().view('i1').data)
219226
return data, ob.dtype, ob.shape, ob.strides
220227

221228

@@ -332,20 +339,19 @@ def tokenize_cudf(ob):
332339

333340
cdef Tokenizer tokenize_handler = Tokenizer()
334341

335-
base_types = (int, float, str, unicode, bytes, complex,
336-
type(None), type, slice, date, datetime, timedelta)
337-
for t in base_types:
342+
cdef set _primitive_types = {
343+
int, float, str, unicode, bytes, complex, type(None), type, slice, date, datetime, timedelta
344+
}
345+
for t in _primitive_types:
338346
tokenize_handler.register(t, lambda ob: ob)
339347

340348
for t in (np.dtype, np.generic):
341-
tokenize_handler.register(t, lambda ob: repr(ob))
349+
tokenize_handler.register(t, lambda ob: ob)
342350

343351
for t in (list, tuple, dict, set):
344352
tokenize_handler.register(t, iterative_tokenize)
345353

346354
tokenize_handler.register(np.ndarray, tokenize_numpy)
347-
tokenize_handler.register(dict, lambda ob: iterative_tokenize(sorted(ob.items())))
348-
tokenize_handler.register(set, lambda ob: iterative_tokenize(sorted(ob)))
349355
tokenize_handler.register(np.random.RandomState, lambda ob: iterative_tokenize(ob.get_state()))
350356
tokenize_handler.register(memoryview, lambda ob: mmh3_hash_from_buffer(ob))
351357
tokenize_handler.register(Enum, tokenize_enum)

0 commit comments

Comments
 (0)