1eb96397e7
Swift EC has a strong constraint about the ring must have a number of replicas which fits ec_k + ec_m. That is validated when servers waking up. However, Swift has more chance to load such an invalid ring when a request comming, calling some node iteration like get_nodes, get_part_nodes or so, and no ring validation is there. This patch moves ring validation from policy validate_ring into the ring instance as validation_hook that will run at ring reload. Since this patch, ring instance will allow to use the old ring if the reload is not fourced. Note that the exception if invalid ring found was changed from RingValidationError to RingLoadError because RingValidationError is a child of RingBuilderError but the ring reload is obviously outside of "builder". Closes-Bug: #1534572 Change-Id: I6428fbfb04e0c79679b917d5e57bd2a34f2a0875
77 lines
1.7 KiB
Python
77 lines
1.7 KiB
Python
# Copyright (c) 2010-2013 OpenStack, LLC.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import unittest
|
|
|
|
from test.unit.proxy import test_server
|
|
from test.unit.proxy.test_server import teardown
|
|
|
|
from swift.obj import mem_server
|
|
|
|
|
|
def setup():
|
|
test_server.do_setup(mem_server)
|
|
|
|
|
|
class TestController(test_server.TestController):
|
|
pass
|
|
|
|
|
|
class TestProxyServer(test_server.TestProxyServer):
|
|
pass
|
|
|
|
|
|
class TestObjectController(test_server.TestObjectController):
|
|
def test_PUT_no_etag_fallocate(self):
|
|
# mem server doesn't call fallocate(), believe it or not
|
|
pass
|
|
|
|
# these tests all go looking in the filesystem
|
|
def test_policy_IO(self):
|
|
pass
|
|
|
|
def test_PUT_ec(self):
|
|
pass
|
|
|
|
def test_PUT_ec_multiple_segments(self):
|
|
pass
|
|
|
|
def test_PUT_ec_fragment_archive_etag_mismatch(self):
|
|
pass
|
|
|
|
def test_reload_ring_ec(self):
|
|
pass
|
|
|
|
|
|
class TestContainerController(test_server.TestContainerController):
|
|
pass
|
|
|
|
|
|
class TestAccountController(test_server.TestAccountController):
|
|
pass
|
|
|
|
|
|
class TestAccountControllerFakeGetResponse(
|
|
test_server.TestAccountControllerFakeGetResponse):
|
|
pass
|
|
|
|
|
|
if __name__ == '__main__':
|
|
setup()
|
|
try:
|
|
unittest.main()
|
|
finally:
|
|
teardown()
|