Attempt to fix swift_pypy memory issues
Move to use tempauth to resolve memory issues resulting from an AIO swift install running in pypy. This PR adds some options for using pypy: * Set a pypy Garbage collection value This PR includes some tempauth fixes to make it useable: * Set the tempauth users based on a variable Testing is changed as follows for pypy: * Use only memcache within swift-proxy * Remove galera/keystone * Add swap for swift-storage hosts * Use tempauth for pypy * Reduce to 2 swift hosts Change-Id: Ic1ed5acc9b20853d9a159035226f97fda088f035
This commit is contained in:
parent
e8e08ec3e2
commit
3fb6784459
@ -79,6 +79,10 @@ swift_middleware_list:
|
|||||||
- proxy-logging
|
- proxy-logging
|
||||||
- proxy-server
|
- proxy-server
|
||||||
|
|
||||||
|
# Setup tempauth users list (user_<account>_<username> = <password> <roles>)
|
||||||
|
swift_tempauth_users:
|
||||||
|
- "user_admin_admin = admin .admin .reseller_admin"
|
||||||
|
|
||||||
## Swift default ports
|
## Swift default ports
|
||||||
swift_proxy_port: "8080"
|
swift_proxy_port: "8080"
|
||||||
# You can change the object, container, account ports.
|
# You can change the object, container, account ports.
|
||||||
@ -387,10 +391,15 @@ swift_pretend_min_part_hours_passed: False
|
|||||||
# Set this option to enable or disable the pypy interpreter for swift
|
# Set this option to enable or disable the pypy interpreter for swift
|
||||||
swift_pypy_enabled: false
|
swift_pypy_enabled: false
|
||||||
swift_pypy_archive:
|
swift_pypy_archive:
|
||||||
url: "https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2"
|
url: "https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.6.0-linux64.tar.bz2"
|
||||||
sha256: "6d0e8b14875b76b1e77f06a2ee3f1fb5015a645a951ba7a7586289344d4d9c22"
|
sha256: "aad55328cb0673a60b2633dcc3c36cf452917ac906b577eb3aed5876a7666fca"
|
||||||
swift_pypy_version: "{{ swift_pypy_archive['url'] | basename | replace('.tar.bz2', '') }}"
|
swift_pypy_version: "{{ swift_pypy_archive['url'] | basename | replace('.tar.bz2', '') }}"
|
||||||
swift_pypy_env: "/opt/pypy-runtime/{{ swift_pypy_version }}/bin/pypy"
|
swift_pypy_env: "/opt/pypy-runtime/{{ swift_pypy_version }}/bin/pypy"
|
||||||
|
# Set the Garbage Collection (GC) options for pypy if you would like to tune these
|
||||||
|
# More info on pypy garbage collection can be found here:
|
||||||
|
# http://doc.pypy.org/en/latest/gc_info.html
|
||||||
|
#swift_pypy_gc_min: "15M"
|
||||||
|
#swift_pypy_gc_max: "1GB"
|
||||||
|
|
||||||
# This variable is used by the repo_build process to determine
|
# This variable is used by the repo_build process to determine
|
||||||
# which host group to check for members of before building the
|
# which host group to check for members of before building the
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- When using the pypy python interpreter you can configure the garbage
|
||||||
|
collection (gc) settings for pypy. Set the minimum GC value using the
|
||||||
|
``swift_pypy_gc_min`` variable. GC will only happen when the memory
|
||||||
|
size is above this value. Set the maximum GC value using the
|
||||||
|
``swift_pypy_gc_max`` variable. This is the maximum memory heap size
|
||||||
|
for pypy.
|
||||||
|
Both variables are not defined by default, and will only be used if
|
||||||
|
the values are defined and ``swift_pypy_enabled`` is set to ``True``.
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- Swift tempauth users now be specified. The
|
||||||
|
``swift_tempauth_users`` variable can be defined as a list
|
||||||
|
of tempauth users, and their permissions. You will still
|
||||||
|
need to specify the appropriate Swift middleware using the
|
||||||
|
``swift_middleware_list`` variable, in order to utilise
|
||||||
|
tempauth.
|
@ -112,6 +112,8 @@
|
|||||||
|
|
||||||
- include: swift_sync_post_install.yml
|
- include: swift_sync_post_install.yml
|
||||||
static: no
|
static: no
|
||||||
when: swift_do_sync | bool
|
when:
|
||||||
|
- swift_do_sync | bool
|
||||||
|
- not swift_do_setup | bool
|
||||||
tags:
|
tags:
|
||||||
- always
|
- always
|
||||||
|
@ -71,10 +71,9 @@ sorting_method = {{ swift_sorting_method }}
|
|||||||
{% if 'tempauth' in swift_middleware_list %}
|
{% if 'tempauth' in swift_middleware_list %}
|
||||||
[filter:tempauth]
|
[filter:tempauth]
|
||||||
use = egg:swift#tempauth
|
use = egg:swift#tempauth
|
||||||
user_admin_admin = admin .admin .reseller_admin
|
{% for user in swift_tempauth_users %}
|
||||||
user_test_tester = testing .admin
|
{{ user }}
|
||||||
user_test2_tester2 = testing2 .admin
|
{% endfor %}
|
||||||
user_test_tester3 = testing3
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if 'authtoken' in swift_middleware_list %}
|
{% if 'authtoken' in swift_middleware_list %}
|
||||||
|
@ -9,6 +9,14 @@ Type=simple
|
|||||||
User={{ swift_system_user_name }}
|
User={{ swift_system_user_name }}
|
||||||
Group={{ swift_system_group_name }}
|
Group={{ swift_system_group_name }}
|
||||||
|
|
||||||
|
{% if swift_pypy_enabled %}
|
||||||
|
{% if swift_pypy_gc_min is defined %}
|
||||||
|
Environment=PYPY_GC_MIN={{ swift_pypy_gc_min }}
|
||||||
|
{% endif %}
|
||||||
|
{% if swift_pypy_gc_max is defined %}
|
||||||
|
Environment=PYPY_GC_MAX={{ swift_pypy_gc_max }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
{% if item.value.program_override is defined %}
|
{% if item.value.program_override is defined %}
|
||||||
ExecStart={{ item.value.program_override }} {{ item.value.program_config_options|default('') }}
|
ExecStart={{ item.value.program_override }} {{ item.value.program_config_options|default('') }}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -10,6 +10,14 @@ respawn limit 10 5
|
|||||||
|
|
||||||
# Set the RUNBIN environment variable
|
# Set the RUNBIN environment variable
|
||||||
env RUNBIN="{{ swift_bin }}/{{ item.value.program_binary | default(item.value.program_name) }}"
|
env RUNBIN="{{ swift_bin }}/{{ item.value.program_binary | default(item.value.program_name) }}"
|
||||||
|
{% if swift_pypy_enabled %}
|
||||||
|
{% if swift_pypy_gc_min is defined %}
|
||||||
|
env PYPY_GC_MIN={{ swift_pypy_gc_min }}
|
||||||
|
{% endif %}
|
||||||
|
{% if swift_pypy_gc_max is defined %}
|
||||||
|
env PYPY_GC_MAX={{ swift_pypy_gc_max }}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
# Change directory to service users home
|
# Change directory to service users home
|
||||||
chdir "{{ swift_system_home_folder }}"
|
chdir "{{ swift_system_home_folder }}"
|
||||||
|
43
tests/inventory_pypy
Normal file
43
tests/inventory_pypy
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
[all]
|
||||||
|
localhost
|
||||||
|
swift-proxy
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[all_containers]
|
||||||
|
swift-proxy
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[memcached_all]
|
||||||
|
swift-proxy
|
||||||
|
|
||||||
|
[service_all:children]
|
||||||
|
memcached_all
|
||||||
|
|
||||||
|
[swift_hosts]
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[swift_proxy]
|
||||||
|
swift-proxy
|
||||||
|
|
||||||
|
[swift_acc]
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[swift_cont]
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[swift_obj]
|
||||||
|
swift-storage1
|
||||||
|
swift-storage2
|
||||||
|
|
||||||
|
[swift_all:children]
|
||||||
|
swift_acc
|
||||||
|
swift_proxy
|
||||||
|
swift_cont
|
||||||
|
swift_obj
|
||||||
|
|
||||||
|
[swift_remote_all]
|
61
tests/os_swift-overrides-pypy.yml
Normal file
61
tests/os_swift-overrides-pypy.yml
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
---
|
||||||
|
# Copyright 2015, Rackspace US, Inc.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
bridges:
|
||||||
|
- name: "br-mgmt"
|
||||||
|
ip_addr: "10.1.1.1"
|
||||||
|
- name: "br-storage"
|
||||||
|
ip_addr: "10.1.2.1"
|
||||||
|
- name: "br-repl"
|
||||||
|
ip_addr: "10.1.3.1"
|
||||||
|
|
||||||
|
# These values are quite low due to memory constraints in an AIO
|
||||||
|
swift_pypy_gc_min: "5M"
|
||||||
|
swift_pypy_gc_max: "200M"
|
||||||
|
swift_pypy_enabled: True
|
||||||
|
|
||||||
|
swift_middleware_list:
|
||||||
|
- catch_errors
|
||||||
|
- gatekeeper
|
||||||
|
- healthcheck
|
||||||
|
- proxy-logging
|
||||||
|
- "{% if swift_ceilometer_enabled | bool %}ceilometer{% endif %}"
|
||||||
|
- cache
|
||||||
|
- container_sync
|
||||||
|
- bulk
|
||||||
|
- tempurl
|
||||||
|
- ratelimit
|
||||||
|
- tempauth
|
||||||
|
- staticweb
|
||||||
|
- container-quotas
|
||||||
|
- account-quotas
|
||||||
|
- slo
|
||||||
|
- dlo
|
||||||
|
- proxy-logging
|
||||||
|
- proxy-server
|
||||||
|
|
||||||
|
swift_tempauth_users:
|
||||||
|
- "user_admin_admin = admin .admin .reseller_admin"
|
||||||
|
- "user_test1_test1 = test1 .admin"
|
||||||
|
- "user_test2_test2 = test2 .admin"
|
||||||
|
- "user_test1_test3 = test3"
|
||||||
|
- "user_test5_test5 = test5 service"
|
||||||
|
- "user_test6_test6 = test6 .reseller_admin"
|
||||||
|
|
||||||
|
swift_hard_open_file_limits: 30720
|
||||||
|
swift_soft_open_file_limits: 12288
|
||||||
|
|
||||||
|
swift_rsync_module_per_drive: True
|
||||||
|
test_swift_repl_number: 2
|
@ -1,17 +1,20 @@
|
|||||||
[func_test]
|
[func_test]
|
||||||
|
{% if groups['keystone_all'] is not defined %}
|
||||||
# sample config for Swift with tempauth
|
# sample config for Swift with tempauth
|
||||||
#auth_host = 10.100.100.2
|
auth_host = {{ test_swift_proxy_host }}
|
||||||
#auth_port = 5000
|
auth_port = 8080
|
||||||
#auth_ssl = no
|
auth_ssl = no
|
||||||
#auth_prefix = /auth/
|
auth_prefix = /auth/
|
||||||
|
{% else %}
|
||||||
## sample config for Swift with Keystone v2 API
|
## sample config for Swift with Keystone v2 API
|
||||||
# For keystone v2 change auth_version to 2 and auth_prefix to /v2.0/
|
# For keystone v2 change auth_version to 2 and auth_prefix to /v2.0/
|
||||||
# And "allow_account_management" should not be set "true"
|
# And "allow_account_management" should not be set "true"
|
||||||
auth_version = 3
|
auth_version = 3
|
||||||
auth_host = {{ hostvars[groups['keystone_all'][0]]['ansible_host'] }}
|
auth_host = {{ test_keystone_host }}
|
||||||
auth_port = 5000
|
auth_port = 5000
|
||||||
auth_ssl = no
|
auth_ssl = no
|
||||||
auth_prefix = /v3/
|
auth_prefix = /v3/
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
# Primary functional test account (needs admin access to the account)
|
# Primary functional test account (needs admin access to the account)
|
||||||
account = test1
|
account = test1
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
- { project_name: "test2", domain_name: "Default" }
|
- { project_name: "test2", domain_name: "Default" }
|
||||||
- { project_name: "test5", domain_name: "Default" }
|
- { project_name: "test5", domain_name: "Default" }
|
||||||
- { project_name: "test6", domain_name: "Default" }
|
- { project_name: "test6", domain_name: "Default" }
|
||||||
|
when: groups['keystone_all'] is defined
|
||||||
register: add_service
|
register: add_service
|
||||||
run_once: true
|
run_once: true
|
||||||
until: add_service|success
|
until: add_service|success
|
||||||
@ -37,6 +38,7 @@
|
|||||||
with_items:
|
with_items:
|
||||||
- "test-role"
|
- "test-role"
|
||||||
- "test5"
|
- "test5"
|
||||||
|
when: groups['keystone_all'] is defined
|
||||||
run_once: true
|
run_once: true
|
||||||
register: add_service
|
register: add_service
|
||||||
until: add_service|success
|
until: add_service|success
|
||||||
@ -60,6 +62,7 @@
|
|||||||
- { user_name: "test3", project_name: "test1", password: "test3", domain_name: "Default" }
|
- { user_name: "test3", project_name: "test1", password: "test3", domain_name: "Default" }
|
||||||
- { user_name: "test5", project_name: "test5", password: "test5", domain_name: "Default" }
|
- { user_name: "test5", project_name: "test5", password: "test5", domain_name: "Default" }
|
||||||
- { user_name: "test6", project_name: "test6", password: "test6", domain_name: "Default" }
|
- { user_name: "test6", project_name: "test6", password: "test6", domain_name: "Default" }
|
||||||
|
when: groups['keystone_all'] is defined
|
||||||
run_once: true
|
run_once: true
|
||||||
register: add_service
|
register: add_service
|
||||||
until: add_service|success
|
until: add_service|success
|
||||||
@ -83,6 +86,7 @@
|
|||||||
- { user_name: "test3", project_name: "test1", role_name: "test-role", domain_name: "Default" }
|
- { user_name: "test3", project_name: "test1", role_name: "test-role", domain_name: "Default" }
|
||||||
- { user_name: "test5", project_name: "test5", role_name: "test5", domain_name: "Default" }
|
- { user_name: "test5", project_name: "test5", role_name: "test5", domain_name: "Default" }
|
||||||
- { user_name: "test6", project_name: "test6", role_name: "ResellerAdmin", domain_name: "Default" }
|
- { user_name: "test6", project_name: "test6", role_name: "ResellerAdmin", domain_name: "Default" }
|
||||||
|
when: groups['keystone_all'] is defined
|
||||||
retries: 5
|
retries: 5
|
||||||
run_once: true
|
run_once: true
|
||||||
register: add_service
|
register: add_service
|
||||||
@ -108,6 +112,26 @@
|
|||||||
dest: "/etc/swift/test.conf"
|
dest: "/etc/swift/test.conf"
|
||||||
owner: "swift"
|
owner: "swift"
|
||||||
group: "swift"
|
group: "swift"
|
||||||
|
- name: Create swap file for swift-storage hosts
|
||||||
|
command: dd if=/dev/zero of=/swift_swap bs=1M count=1024
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['swift_hosts']
|
||||||
|
- name: Make swap for swift-storage hosts
|
||||||
|
command: mkswap /swift_swap
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['swift_hosts']
|
||||||
|
- name: Add swap to fstab for swift-storage hosts
|
||||||
|
lineinfile:
|
||||||
|
dest: /etc/fstab
|
||||||
|
regexp: "swift_swap"
|
||||||
|
line: "/swift_swap none swap sw 0 0"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['swift_hosts']
|
||||||
|
- name: Turn swap on for swift-storage hosts
|
||||||
|
command: swapon -a
|
||||||
|
when:
|
||||||
|
- inventory_hostname in groups['swift_hosts']
|
||||||
- name: Run functional tests for swift
|
- name: Run functional tests for swift
|
||||||
shell: "source /openstack/venvs/swift-untagged/bin/activate && ./.functests"
|
shell: "source /openstack/venvs/swift-untagged/bin/activate && ./.functests"
|
||||||
args:
|
args:
|
||||||
|
3
tox.ini
3
tox.ini
@ -116,7 +116,8 @@ deps =
|
|||||||
{[testenv:ansible]deps}
|
{[testenv:ansible]deps}
|
||||||
setenv =
|
setenv =
|
||||||
{[testenv]setenv}
|
{[testenv]setenv}
|
||||||
ANSIBLE_PARAMETERS=-vvv -e swift_pypy_enabled=True
|
ANSIBLE_INVENTORY={toxinidir}/tests/inventory_pypy
|
||||||
|
ANSIBLE_OVERRIDES={toxinidir}/tests/os_swift-overrides-pypy.yml
|
||||||
commands =
|
commands =
|
||||||
{[testenv:tests_clone]commands}
|
{[testenv:tests_clone]commands}
|
||||||
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
|
bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
|
||||||
|
Loading…
Reference in New Issue
Block a user