Вы говорите, что когда первичный срез отключен от двух других узлов, он должен оставаться на месте, в противном случае доступность записи теряется, но это не обязательно так. Если два других узла находятся на самом деле вверх, а с другой стороны сетевого раздела, то они выбрали новый первичный (поскольку два из трех - это большинство), и именно это первично принимает новые записи.
Если предыдущий первичный продолжал принимать записи, у вас были бы потенциально конфликтующие данные, в которых не было механизма для решения. Поскольку набор реплик MongoDB является единой первичной архитектурой (в отличие от системы с несколькими мастерами), механизм выборов гарантирует, что одновременно не может быть двух праймериз.
С точки зрения двух второстепенных, сетевой раздел такой же, как первичный, недоступен, и с точки зрения первичной сети сетевой раздел неотличим от «обоих остальных узлов». Он уходит в отставку, потому что в случае сетевого раздела уже может быть другой первичный с другой стороны, и он уверяет, что не может быть двух праймериз, спустившись вниз.
Не так, набор реплик «отступает, когда первичный чувствует себя одиноким - причина, по которой основные шаги вниз, когда он чувствует себя в одиночку, заключается в том, чтобы сохранить целостность набора реплик в целом. Неверно, что установка высокоприоритетного показателя фиксирует роль узла - первичный может быть избран только на основе консенсуса среди большинства - все приоритетные оценки влияют на выборы, когда все остальные вещи равны.
Я высоко рекомендуйте отличную серию «назовите меня, возможно», чтобы прочитать проблемы доступности записи в распределенной системе: http://aphyr.com/posts/281-call-me-maybe-carly-rae-jepsen- и самая опасность-оф-сеть-разбиения
В приведенном выше фрагменте ваше globalVariables.tableData_Dashboard.all(by.tagName("tr")).count()
возвращает обещание . Поэтому, когда вы добавляете их вместе, вы добавляете обещание для int и int. Следующая вещь, которая выглядит странно: var Button = 'globalVariables.Edit_Button_'+i;
Это не оценивается как elementFinder. Я согласен с комментарием Йонга выше, где вы должны использовать globalVariables['Edit_Button_'+i];
Так что я собираюсь ответить на этот вопрос с помощью async / await и поток управления отключен. Это с SELENIUM_PROMISE_MANAGER: false,
, установленным в вашем файле конфигурации.
it('should show the same data in both Page' , async () => {
const RowCount=
(await globalVariables.tableData_Dashboard.all(by.tagName("tr")).count()) - 1;
for (var i=1; i < RowCount; ++i){
const button = globalVariables['Edit_Button_'+i];
expect(await button.isDisplayed());
// do something
}
});