Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
957a4fce7e | |||
f201ecdd51 | |||
4afb617f59 | |||
d3fde0569f | |||
438b64f6c3 | |||
2b0a802ea1 | |||
0dd49c1d67 | |||
410170db96 | |||
7d8523e0e5 | |||
db915184c6 | |||
5ae6fea49c |
@@ -684,6 +684,24 @@ jobs:
|
||||
echo ""
|
||||
done
|
||||
|
||||
test_write_iothreads:
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
container: ${{env.TEST_IMAGE}}:${{github.sha}}
|
||||
steps:
|
||||
- name: Run test
|
||||
id: test
|
||||
timeout-minutes: 3
|
||||
run: TEST_NAME=iothreads GLOBAL_CONFIG=',"client_iothread_count":4' /root/vitastor/tests/test_write.sh
|
||||
- name: Print logs
|
||||
if: always() && steps.test.outcome == 'failure'
|
||||
run: |
|
||||
for i in /root/vitastor/testdata/*.log /root/vitastor/testdata/*.txt; do
|
||||
echo "-------- $i --------"
|
||||
cat $i
|
||||
echo ""
|
||||
done
|
||||
|
||||
test_write_no_same:
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
|
@@ -2,6 +2,6 @@ cmake_minimum_required(VERSION 2.8.12)
|
||||
|
||||
project(vitastor)
|
||||
|
||||
set(VITASTOR_VERSION "2.2.0")
|
||||
set(VITASTOR_VERSION "2.2.1")
|
||||
|
||||
add_subdirectory(src)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
VITASTOR_VERSION ?= v2.2.0
|
||||
VITASTOR_VERSION ?= v2.2.1
|
||||
|
||||
all: build push
|
||||
|
||||
|
@@ -49,7 +49,7 @@ spec:
|
||||
capabilities:
|
||||
add: ["SYS_ADMIN"]
|
||||
allowPrivilegeEscalation: true
|
||||
image: vitalif/vitastor-csi:v2.2.0
|
||||
image: vitalif/vitastor-csi:v2.2.1
|
||||
args:
|
||||
- "--node=$(NODE_ID)"
|
||||
- "--endpoint=$(CSI_ENDPOINT)"
|
||||
|
@@ -121,7 +121,7 @@ spec:
|
||||
privileged: true
|
||||
capabilities:
|
||||
add: ["SYS_ADMIN"]
|
||||
image: vitalif/vitastor-csi:v2.2.0
|
||||
image: vitalif/vitastor-csi:v2.2.1
|
||||
args:
|
||||
- "--node=$(NODE_ID)"
|
||||
- "--endpoint=$(CSI_ENDPOINT)"
|
||||
|
@@ -5,7 +5,7 @@ package vitastor
|
||||
|
||||
const (
|
||||
vitastorCSIDriverName = "csi.vitastor.io"
|
||||
vitastorCSIDriverVersion = "2.2.0"
|
||||
vitastorCSIDriverVersion = "2.2.1"
|
||||
)
|
||||
|
||||
// Config struct fills the parameters of request or user input
|
||||
|
2
debian/changelog
vendored
2
debian/changelog
vendored
@@ -1,4 +1,4 @@
|
||||
vitastor (2.2.0-1) unstable; urgency=medium
|
||||
vitastor (2.2.1-1) unstable; urgency=medium
|
||||
|
||||
* Bugfixes
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
VITASTOR_VERSION ?= v2.2.0
|
||||
VITASTOR_VERSION ?= v2.2.1
|
||||
|
||||
all: build push
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
#
|
||||
|
||||
# Desired Vitastor version
|
||||
VITASTOR_VERSION=v2.2.0
|
||||
VITASTOR_VERSION=v2.2.1
|
||||
|
||||
# Additional arguments for all containers
|
||||
# For example, you may want to specify a custom logging driver here
|
||||
|
@@ -310,6 +310,10 @@ If you set this parameter to "random", clients will try to distribute read reque
|
||||
all available secondary OSDs. This mode is mainly useful for tests, but, probably, not
|
||||
really required in production setups.
|
||||
|
||||
[PG locks](osd.en.md#enable_pg_locks) are required for local reads to function. However,
|
||||
PG locks are enabled automatically by default for pools with enabled local reads, so you
|
||||
don't have to enable them explicitly.
|
||||
|
||||
## max_osd_combinations
|
||||
|
||||
- Type: integer
|
||||
|
@@ -309,6 +309,9 @@ meow недоступен".
|
||||
запросы чтения по всем доступным вторичным OSD. Этот режим в основном полезен для тестов,
|
||||
но, скорее всего, редко нужен в реальных инсталляциях.
|
||||
|
||||
Для работы локальных чтений требуются [блокировки PG](osd.ru.md#enable_pg_locks). Включать
|
||||
их явно не нужно - они включаются автоматически для пулов с включёнными локальными чтениями.
|
||||
|
||||
## max_osd_combinations
|
||||
|
||||
- Тип: целое число
|
||||
|
@@ -26,9 +26,9 @@ at Vitastor Kubernetes operator: https://github.com/Antilles7227/vitastor-operat
|
||||
The instruction is very simple.
|
||||
|
||||
1. Download a Docker image of the desired version: \
|
||||
`docker pull vitastor:v2.2.0`
|
||||
`docker pull vitastor:v2.2.1`
|
||||
2. Install scripts to the host system: \
|
||||
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitastor:v2.2.0 install.sh`
|
||||
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitastor:v2.2.1 install.sh`
|
||||
3. Reload udev rules: \
|
||||
`udevadm control --reload-rules`
|
||||
|
||||
|
@@ -25,9 +25,9 @@ Vitastor можно установить в Docker/Podman. При этом etcd,
|
||||
Инструкция по установке максимально простая.
|
||||
|
||||
1. Скачайте Docker-образ желаемой версии: \
|
||||
`docker pull vitastor:v2.2.0`
|
||||
`docker pull vitastor:v2.2.1`
|
||||
2. Установите скрипты в хост-систему командой: \
|
||||
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitastor:v2.2.0 install.sh`
|
||||
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitastor:v2.2.1 install.sh`
|
||||
3. Перезагрузите правила udev: \
|
||||
`udevadm control --reload-rules`
|
||||
|
||||
|
@@ -10,8 +10,17 @@ Copyright (c) Vitaliy Filippov (vitalif [at] yourcmc.ru), 2019+
|
||||
|
||||
Join Vitastor Telegram Chat: https://t.me/vitastor
|
||||
|
||||
All server-side code (OSD, Monitor and so on) is licensed under the terms of
|
||||
Vitastor Network Public License 1.1 (VNPL 1.1), a copyleft license based on
|
||||
License: VNPL 1.1 for server-side code and dual VNPL 1.1 + GPL 2.0+ for client tools.
|
||||
|
||||
Server-side code is licensed only under the terms of VNPL.
|
||||
|
||||
Client libraries (cluster_client and so on) are dual-licensed under the same
|
||||
VNPL 1.1 and also GNU GPL 2.0 or later to allow for compatibility with GPLed
|
||||
software like QEMU and fio.
|
||||
|
||||
## VNPL
|
||||
|
||||
Vitastor Network Public License 1.1 (VNPL 1.1) is a copyleft license based on
|
||||
GNU GPLv3.0 with the additional "Network Interaction" clause which requires
|
||||
opensourcing all programs directly or indirectly interacting with Vitastor
|
||||
through a computer network and expressly designed to be used in conjunction
|
||||
@@ -20,18 +29,83 @@ the terms of the same license, but also under the terms of any GPL-Compatible
|
||||
Free Software License, as listed by the Free Software Foundation.
|
||||
This is a stricter copyleft license than the Affero GPL.
|
||||
|
||||
Please note that VNPL doesn't require you to open the code of proprietary
|
||||
software running inside a VM if it's not specially designed to be used with
|
||||
Vitastor.
|
||||
The idea of VNPL is, in addition to modules linked to Vitastor code in a single
|
||||
binary file, to extend copyleft action to micro-service modules only interacting
|
||||
with it over the network.
|
||||
|
||||
Basically, you can't use the software in a proprietary environment to provide
|
||||
its functionality to users without opensourcing all intermediary components
|
||||
standing between the user and Vitastor or purchasing a commercial license
|
||||
from the author 😀.
|
||||
|
||||
Client libraries (cluster_client and so on) are dual-licensed under the same
|
||||
VNPL 1.1 and also GNU GPL 2.0 or later to allow for compatibility with GPLed
|
||||
software like QEMU and fio.
|
||||
At the same time, VNPL doesn't impose any restrictions on software *not specially designed*
|
||||
to be used with Vitastor, for example, on Windows running inside a VM with a Vitastor disk.
|
||||
|
||||
You can find the full text of VNPL-1.1 in the file [VNPL-1.1.txt](../../VNPL-1.1.txt).
|
||||
GPL 2.0 is also included in this repository as [GPL-2.0.txt](../../GPL-2.0.txt).
|
||||
## Explanation
|
||||
|
||||
Network copyleft is governed by the clause **13. Remote Network Interaction** of VNPL.
|
||||
|
||||
A program is considered to be a "Proxy Program" if it meets both conditions:
|
||||
- It is specially designed to be used with Vitastor. Basically, it means that the program
|
||||
has any functionality specific to Vitastor and thus "knows" that it works with Vitastor,
|
||||
not with something random.
|
||||
- It interacts with Vitastor directly or indirectly through any programming interface,
|
||||
including API, CLI, network or any wrapper (also considered a Proxy Program itself).
|
||||
|
||||
If, in addition to that:
|
||||
- You give any user an apportunity to interact with Vitastor directly or indirectly through
|
||||
any computer interface including the network or any number of wrappers (Proxy Programs).
|
||||
|
||||
Then VNPL requires you to publish the code of all above Proxy Programs to all above users
|
||||
under the terms of any GPL-compatible license - that is, GPL, LGPL, MIT/BSD or Apache 2,
|
||||
because "GPL compatibility" is treated as an ability to legally include licensed code in
|
||||
a GPL application.
|
||||
|
||||
So, if you have a "Proxy Program", but it's not open to the user who directly or indirectly
|
||||
interacts with Vitastor - you are forbidden to use Vitastor under the terms of VNPL and you
|
||||
need a commercial license which doesn't contain open-source requirements.
|
||||
|
||||
## Examples
|
||||
|
||||
- Vitastor Kubernetes CSI driver which creates PersistentVolumes by calling `vitastor-cli create`.
|
||||
- Yes, it interacts with Vitastor through vitastor-cli.
|
||||
- Yes, it is designed specially for use with Vitastor (it has no sense otherwise).
|
||||
- So, CSI driver **definitely IS** a Proxy Program and must be published under the terms of
|
||||
a free software license.
|
||||
- Windows, installed in a VM with the system disk on Vitastor storage.
|
||||
- Yes, it interacts with Vitastor indirectly - it reads and writes data through the block
|
||||
device interface, emulated by QEMU.
|
||||
- No, it definitely isn't designed specially for use with Vitastor - Windows was created long
|
||||
ago before Vitastor and doesn't know anything about it.
|
||||
- So, Windows **definitely IS NOT** a Proxy Program and VNPL doesn't require to open it.
|
||||
- Cloud control panel which makes requests to Vitastor Kubernetes CSI driver.
|
||||
- Yes, it interacts with Vitastor indirectly through the CSI driver, which is a Proxy Program.
|
||||
- May or may not be designed specially for use with Vitastor. How to determine exactly?
|
||||
Imagine that Vitastor is replaced with any other storage (for example, with a proprietary).
|
||||
Do control panel functions change in any way? If they do (for example, if snapshots stop working),
|
||||
then the panel contains specific functionality and thus is designed specially for use with Vitastor.
|
||||
Otherwise, the panel is universal and isn't designed specially for Vitastor.
|
||||
- So, whether you are required to open-source the panel also **depends** on whether it
|
||||
contains specific functionality or not.
|
||||
|
||||
## Why?
|
||||
|
||||
Because I believe into the spirit of copyleft (Linux wouldn't become so popular without GPL!)
|
||||
and, at the same time, I want to have a way to monetize the product.
|
||||
|
||||
Existing licenses including AGPL are useless for it with an SDS - SDS is a very deeply
|
||||
internal software which is almost definitely invisible to the user and thus AGPL doesn't
|
||||
require anyone to open the code even if they make a proprietary fork.
|
||||
|
||||
And, in fact, the current situation in the world where GPL is though to only restrict direct
|
||||
linking of programs into a single executable file, isn't much correct. Nowadays, programs
|
||||
are more often linked with network API calls, not with /usr/bin/ld, and a software product
|
||||
may consist of dozens of microservices interacting with each other over the network.
|
||||
|
||||
That's why we need VNPL to keep the license sufficiently copyleft.
|
||||
|
||||
## License Texts
|
||||
|
||||
- VNPL 1.1 in English: [VNPL-1.1.txt](../../VNPL-1.1.txt)
|
||||
- VNPL 1.1 in Russian: [VNPL-1.1-RU.txt](../../VNPL-1.1-RU.txt)
|
||||
- GPL 2.0: [GPL-2.0.txt](../../GPL-2.0.txt)
|
||||
|
@@ -12,6 +12,14 @@
|
||||
|
||||
Лицензия: VNPL 1.1 на серверный код и двойная VNPL 1.1 + GPL 2.0+ на клиентский.
|
||||
|
||||
Серверные компоненты распространяются только на условиях VNPL.
|
||||
|
||||
Клиентские библиотеки распространяются на условиях двойной лицензии VNPL 1.0
|
||||
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
||||
совместимости с таким ПО, как QEMU и fio.
|
||||
|
||||
## VNPL
|
||||
|
||||
VNPL - "сетевой копилефт", собственная свободная копилефт-лицензия
|
||||
Vitastor Network Public License 1.1, основанная на GNU GPL 3.0 с дополнительным
|
||||
условием "Сетевого взаимодействия", требующим распространять все программы,
|
||||
@@ -29,9 +37,70 @@ Vitastor Network Public License 1.1, основанная на GNU GPL 3.0 с д
|
||||
На Windows и любое другое ПО, не разработанное *специально* для использования
|
||||
вместе с Vitastor, никакие ограничения не накладываются.
|
||||
|
||||
Клиентские библиотеки распространяются на условиях двойной лицензии VNPL 1.0
|
||||
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
||||
совместимости с таким ПО, как QEMU и fio.
|
||||
## Пояснение
|
||||
|
||||
Вы можете найти полный текст VNPL 1.1 на английском языке в файле [VNPL-1.1.txt](../../VNPL-1.1.txt),
|
||||
VNPL 1.1 на русском языке в файле [VNPL-1.1-RU.txt](../../VNPL-1.1-RU.txt), а GPL 2.0 в файле [GPL-2.0.txt](../../GPL-2.0.txt).
|
||||
Сетевой копилефт регулируется пунктом лицензии **13. Удалённое сетевое взаимодействие**.
|
||||
|
||||
Программа считается "прокси-программой", если верны оба условия:
|
||||
- Она создана специально для работы вместе с Vitastor. По сути это означает, что программа
|
||||
должна иметь специфичный для Vitastor функционал, то есть, "знать", что она взаимодействует
|
||||
именно с Vitastor.
|
||||
- Она прямо или косвенно взаимодействует с Vitastor через абсолютно любой программный
|
||||
интерфейс, включая любые способы вызова: API, CLI, сеть или через какую-то обёртку (в
|
||||
свою очередь тоже являющуюся прокси-программой).
|
||||
|
||||
Если в дополнение к этому также:
|
||||
- Вы предоставляете любому пользователю возможность взаимодействовать с Vitastor по сети,
|
||||
опять-таки, через любой интерфейс или любую серию "обёрток" (прокси-программ)
|
||||
|
||||
То, согласно VNPL, вы должны открыть код "прокси-программ" **таким пользователям** на условиях
|
||||
любой GPL-совместимой лицензии - то есть, GPL, LGPL, MIT/BSD или Apache 2 - "совместимость с GPL"
|
||||
понимается как возможность включать лицензируемый код в GPL-приложение.
|
||||
|
||||
Соответственно, если у вас есть "прокси-программа", но её код не открыт пользователю,
|
||||
который прямо или косвенно взаимодействует с Vitastor - вам запрещено использовать Vitastor
|
||||
на условиях VNPL и вам нужна коммерческая лицензия, не содержащая требований об открытии кода.
|
||||
|
||||
## Примеры
|
||||
|
||||
- Kubernetes CSI-драйвер Vitastor, создающий PersistentVolume с помощью вызова `vitastor-cli create`.
|
||||
- Да, взаимодействует с Vitastor через vitastor-cli.
|
||||
- Да, создавался специально для работы с Vitastor (иначе в чём же ещё его смысл).
|
||||
- Значит, CSI-драйвер **точно считается** "прокси-программой" и должен быть открыт под свободной
|
||||
лицензией.
|
||||
- Windows, установленный в виртуальную машину на диске Vitastor.
|
||||
- Да, взаимодействует с Vitastor "прямо или косвенно" - пишет и читает данные через интерфейс
|
||||
блочного устройства, эмулируемый QEMU.
|
||||
- Нет, точно не создан *специально для работы с Vitastor* - когда его создавали, никакого
|
||||
Vitastor ещё и в помине не было.
|
||||
- Значит, Windows **точно не считается** "прокси-программой" и на него требования VNPL не распространяются.
|
||||
- Панель управления облака, делающая запросы к Kubernetes CSI-драйверу Vitastor.
|
||||
- Да, взаимодействует с Vitastor косвенно через CSI-драйвер, являющийся "прокси-программой".
|
||||
- Сходу не известно, создавалась ли конкретно для работы с Vitastor. Как понять, да или нет?
|
||||
Представьте, что Vitastor заменён на любую другую систему хранения (например, на проприетарную).
|
||||
Работа панели управления изменится? Если да (например, перестанут работать снапшоты) - значит,
|
||||
панель содержит специфичный функционал и "создана специально для работы с Vitastor".
|
||||
Если нет - значит, специфичного функционала панель не содержит и в принципе она универсальна.
|
||||
- Нужно ли открывать панель - **зависит** от того, содержит она специфичный функционал или нет.
|
||||
|
||||
## Почему так?
|
||||
|
||||
Потому что я одновременно верю в дух копилефт-лицензий (Linux не стал бы так популярен,
|
||||
если бы не GPL!) и хочу иметь возможность монетизации продукта.
|
||||
|
||||
При этом использовать даже AGPL для программной СХД бессмысленно - это глубоко внутреннее
|
||||
ПО, которое пользователь почти наверняка не увидит вообще, поэтому и открывать код никому
|
||||
никогда не придётся, даже при создании производного продукта.
|
||||
|
||||
Да и в целом сложившаяся в мире ситуация, при которой действие GPL ограничивается только
|
||||
прямым связыванием в один исполняемый файл, не очень корректна. В настоящее время программы
|
||||
гораздо чаще интегрируют сетевыми вызовами, а не с помощью /usr/bin/ld, и общий программный
|
||||
продукт может состоять из нескольких десятков микросервисов, взаимодействующих по сети.
|
||||
|
||||
Поэтому для сохранения достаточной "копилефтности" и придумана VNPL.
|
||||
|
||||
## Тексты лицензий
|
||||
|
||||
- VNPL 1.1 на английском языке: [VNPL-1.1.txt](../../VNPL-1.1.txt)
|
||||
- VNPL 1.1 на русском языке: [VNPL-1.1-RU.txt](../../VNPL-1.1-RU.txt)
|
||||
- GPL 2.0: [GPL-2.0.txt](../../GPL-2.0.txt)
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vitastor-mon",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.1",
|
||||
"description": "Vitastor SDS monitor service",
|
||||
"main": "mon-main.js",
|
||||
"scripts": {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vitastor",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.1",
|
||||
"description": "Low-level native bindings to Vitastor client library",
|
||||
"main": "index.js",
|
||||
"keywords": [
|
||||
|
@@ -50,7 +50,7 @@ from cinder.volume import configuration
|
||||
from cinder.volume import driver
|
||||
from cinder.volume import volume_utils
|
||||
|
||||
VITASTOR_VERSION = '2.2.0'
|
||||
VITASTOR_VERSION = '2.2.1'
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@@ -1,11 +1,11 @@
|
||||
Name: vitastor
|
||||
Version: 2.2.0
|
||||
Version: 2.2.1
|
||||
Release: 1%{?dist}
|
||||
Summary: Vitastor, a fast software-defined clustered block storage
|
||||
|
||||
License: Vitastor Network Public License 1.1
|
||||
URL: https://vitastor.io/
|
||||
Source0: vitastor-2.2.0.el7.tar.gz
|
||||
Source0: vitastor-2.2.1.el7.tar.gz
|
||||
|
||||
BuildRequires: liburing-devel >= 0.6
|
||||
BuildRequires: gperftools-devel
|
||||
|
@@ -1,11 +1,11 @@
|
||||
Name: vitastor
|
||||
Version: 2.2.0
|
||||
Version: 2.2.1
|
||||
Release: 1%{?dist}
|
||||
Summary: Vitastor, a fast software-defined clustered block storage
|
||||
|
||||
License: Vitastor Network Public License 1.1
|
||||
URL: https://vitastor.io/
|
||||
Source0: vitastor-2.2.0.el8.tar.gz
|
||||
Source0: vitastor-2.2.1.el8.tar.gz
|
||||
|
||||
BuildRequires: liburing-devel >= 0.6
|
||||
BuildRequires: gperftools-devel
|
||||
|
@@ -1,11 +1,11 @@
|
||||
Name: vitastor
|
||||
Version: 2.2.0
|
||||
Version: 2.2.1
|
||||
Release: 1%{?dist}
|
||||
Summary: Vitastor, a fast software-defined clustered block storage
|
||||
|
||||
License: Vitastor Network Public License 1.1
|
||||
URL: https://vitastor.io/
|
||||
Source0: vitastor-2.2.0.el9.tar.gz
|
||||
Source0: vitastor-2.2.1.el9.tar.gz
|
||||
|
||||
BuildRequires: liburing-devel >= 0.6
|
||||
BuildRequires: gperftools-devel
|
||||
|
@@ -19,7 +19,7 @@ if("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/local/?$")
|
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
|
||||
endif()
|
||||
|
||||
add_definitions(-DVITASTOR_VERSION="2.2.0")
|
||||
add_definitions(-DVITASTOR_VERSION="2.2.1")
|
||||
add_definitions(-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wno-sign-compare -Wno-comment -Wno-parentheses -Wno-pointer-arith -fdiagnostics-color=always -fno-omit-frame-pointer -I ${CMAKE_SOURCE_DIR}/src)
|
||||
add_link_options(-fno-omit-frame-pointer)
|
||||
if (${WITH_ASAN})
|
||||
|
@@ -33,8 +33,12 @@ void osd_messenger_t::read_requests()
|
||||
auto iothread = iothreads.size() ? iothreads[peer_fd % iothreads.size()] : NULL;
|
||||
io_uring_sqe sqe_local;
|
||||
ring_data_t data_local;
|
||||
sqe_local.user_data = (uint64_t)&data_local;
|
||||
io_uring_sqe* sqe = (iothread ? &sqe_local : ringloop->get_sqe());
|
||||
if (iothread)
|
||||
{
|
||||
sqe_local = { .user_data = (uint64_t)&data_local };
|
||||
data_local = {};
|
||||
}
|
||||
if (!sqe)
|
||||
{
|
||||
cl->read_msg.msg_iovlen = 0;
|
||||
|
@@ -194,12 +194,14 @@ bool osd_messenger_t::try_send(osd_client_t *cl)
|
||||
auto iothread = iothreads.size() ? iothreads[peer_fd % iothreads.size()] : NULL;
|
||||
io_uring_sqe sqe_local;
|
||||
ring_data_t data_local;
|
||||
sqe_local.user_data = (uint64_t)&data_local;
|
||||
io_uring_sqe* sqe = (iothread ? &sqe_local : ringloop->get_sqe());
|
||||
if (!sqe)
|
||||
if (iothread)
|
||||
{
|
||||
return false;
|
||||
sqe_local = { .user_data = (uint64_t)&data_local };
|
||||
data_local = {};
|
||||
}
|
||||
if (!sqe)
|
||||
return false;
|
||||
cl->write_msg.msg_iov = cl->send_list.data();
|
||||
cl->write_msg.msg_iovlen = cl->send_list.size() < IOV_MAX ? cl->send_list.size() : IOV_MAX;
|
||||
cl->refs++;
|
||||
|
@@ -6,7 +6,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
|
||||
|
||||
Name: Vitastor
|
||||
Description: Vitastor client library
|
||||
Version: 2.2.0
|
||||
Version: 2.2.1
|
||||
Libs: -L${libdir} -lvitastor_client
|
||||
Cflags: -I${includedir}
|
||||
|
||||
|
@@ -283,6 +283,7 @@ static json11::Json::object parse_args(int narg, const char *args[])
|
||||
!strcmp(opt, "readonly") || !strcmp(opt, "readwrite") ||
|
||||
!strcmp(opt, "force") || !strcmp(opt, "reverse") ||
|
||||
!strcmp(opt, "allow-data-loss") || !strcmp(opt, "allow_data_loss") ||
|
||||
!strcmp(opt, "allow-up") || !strcmp(opt, "allow_up") ||
|
||||
!strcmp(opt, "down-ok") || !strcmp(opt, "down_ok") ||
|
||||
!strcmp(opt, "dry-run") || !strcmp(opt, "dry_run") ||
|
||||
!strcmp(opt, "help") || !strcmp(opt, "all") ||
|
||||
|
@@ -15,7 +15,7 @@ struct rm_osd_t
|
||||
{
|
||||
cli_tool_t *parent;
|
||||
|
||||
bool dry_run, force_warning, force_dataloss;
|
||||
bool dry_run, force_warning, force_dataloss, allow_up;
|
||||
uint64_t etcd_tx_retry_ms = 500;
|
||||
uint64_t etcd_tx_retries = 10000;
|
||||
std::vector<uint64_t> osd_ids;
|
||||
@@ -70,7 +70,7 @@ struct rm_osd_t
|
||||
{
|
||||
if (parent->cli->st_cli.peer_states.find(osd_id) != parent->cli->st_cli.peer_states.end())
|
||||
{
|
||||
is_warning = true;
|
||||
is_warning = !allow_up;
|
||||
still_up.push_back(osd_id);
|
||||
}
|
||||
}
|
||||
@@ -168,7 +168,7 @@ struct rm_osd_t
|
||||
: strtoupper(e["effect"].string_value())+" PGs"))
|
||||
)+" after deleting OSD(s).\n";
|
||||
}
|
||||
if (still_up.size())
|
||||
if (still_up.size() && !allow_up)
|
||||
error += (still_up.size() == 1 ? "OSD " : "OSDs ") + implode(", ", still_up) +
|
||||
(still_up.size() == 1 ? "is" : "are") + " still up. Use `vitastor-disk purge` to delete them.\n";
|
||||
if (is_dataloss && !force_dataloss && !dry_run)
|
||||
@@ -476,6 +476,7 @@ std::function<bool(cli_result_t &)> cli_tool_t::start_rm_osd(json11::Json cfg)
|
||||
auto rm_osd = new rm_osd_t();
|
||||
rm_osd->parent = this;
|
||||
rm_osd->dry_run = cfg["dry_run"].bool_value();
|
||||
rm_osd->allow_up = cfg["allow_up"].bool_value();
|
||||
rm_osd->force_dataloss = cfg["allow_data_loss"].bool_value();
|
||||
rm_osd->force_warning = rm_osd->force_dataloss || cfg["force"].bool_value();
|
||||
if (!cfg["etcd_tx_retries"].is_null())
|
||||
|
@@ -435,7 +435,7 @@ int disk_tool_t::purge_devices(const std::vector<std::string> & devices)
|
||||
printf("%s\n", json11::Json(result).dump().c_str());
|
||||
return 0;
|
||||
}
|
||||
std::vector<std::string> rm_osd_cli = { "vitastor-cli", "rm-osd" };
|
||||
std::vector<std::string> rm_osd_cli = { "vitastor-cli", "rm-osd", "--allow-up" };
|
||||
for (auto osd_num: osd_numbers)
|
||||
{
|
||||
rm_osd_cli.push_back(std::to_string(osd_num));
|
||||
|
@@ -278,6 +278,7 @@ class osd_t
|
||||
void handle_peers();
|
||||
bool check_peer_config(osd_client_t *cl, json11::Json conf);
|
||||
void repeer_pgs(osd_num_t osd_num);
|
||||
void repeer_pg(pg_t & pg);
|
||||
void start_pg_peering(pg_t & pg);
|
||||
void drop_dirty_pg_connections(pool_pg_num_t pg);
|
||||
void record_pg_lock(pg_t & pg, osd_num_t peer_osd, uint64_t pg_state);
|
||||
|
@@ -432,9 +432,16 @@ void osd_t::apply_pg_locks_localize_only()
|
||||
}
|
||||
auto & pool_cfg = pool_it->second;
|
||||
auto & pg = pp.second;
|
||||
auto old_disable_pg_locks = pg.disable_pg_locks;
|
||||
pg.disable_pg_locks = pg_locks_localize_only &&
|
||||
pool_cfg.scheme == POOL_SCHEME_REPLICATED &&
|
||||
pool_cfg.local_reads == POOL_LOCAL_READ_PRIMARY;
|
||||
if (!pg.disable_pg_locks && old_disable_pg_locks)
|
||||
{
|
||||
// Relock PG
|
||||
printf("[PG %u/%u] Repeer to enable PG locks\n", pg.pool_id, pg.pg_num);
|
||||
repeer_pg(pg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -104,21 +104,26 @@ void osd_t::repeer_pgs(osd_num_t peer_osd)
|
||||
{
|
||||
// Repeer this pg
|
||||
printf("[PG %u/%u] Repeer because of OSD %ju\n", pg.pool_id, pg.pg_num, peer_osd);
|
||||
if (!(pg.state & (PG_ACTIVE | PG_REPEERING)) || pg.can_repeer())
|
||||
{
|
||||
start_pg_peering(pg);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Stop accepting new operations, wait for current ones to finish or fail
|
||||
pg.state = pg.state & ~PG_ACTIVE | PG_REPEERING;
|
||||
report_pg_state(pg);
|
||||
}
|
||||
repeer_pg(pg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void osd_t::repeer_pg(pg_t & pg)
|
||||
{
|
||||
if (!(pg.state & (PG_ACTIVE | PG_REPEERING)) || pg.can_repeer())
|
||||
{
|
||||
start_pg_peering(pg);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Stop accepting new operations, wait for current ones to finish or fail
|
||||
pg.state = pg.state & ~PG_ACTIVE | PG_REPEERING;
|
||||
report_pg_state(pg);
|
||||
}
|
||||
}
|
||||
|
||||
// Reset PG state (when peering or stopping)
|
||||
void osd_t::reset_pg(pg_t & pg)
|
||||
{
|
||||
|
@@ -125,6 +125,8 @@ void ring_loop_t::loop()
|
||||
if (cqe->flags & IORING_CQE_F_MORE)
|
||||
{
|
||||
// There will be a second notification
|
||||
if (mt)
|
||||
mu.unlock();
|
||||
d->res = cqe->res;
|
||||
d->more = true;
|
||||
if (d->callback)
|
||||
|
@@ -59,6 +59,7 @@ SCHEME=ec IMMEDIATE_COMMIT=1 ./test_rebalance_verify.sh
|
||||
|
||||
./test_write.sh
|
||||
SCHEME=xor ./test_write.sh
|
||||
TEST_NAME=iothreads GLOBAL_CONFIG=',"client_iothread_count":4' ./test_write.sh
|
||||
|
||||
./test_write_no_same.sh
|
||||
|
||||
|
Reference in New Issue
Block a user