Архитектура Amazon S3 [закрывается]

tiles[x][y+1], если y является максимальным допустимым значением, не будет NULL, кроме как по милости. Это выходит за пределы, и как только вы выходите за пределы, все ставки прекращаются. Вы вызвали неопределенное поведение , и почти все может произойти. Даже то, что вы ожидали.

То же самое относится к сообщенному месту крушения, tiles[x - 1][y - 1].

Правка: опущено решение. Не полезно.

Единственный способ, кроме взятия и сброса всего сайта с орбиты, состоит в том, чтобы проверить индекс, чтобы убедиться, что он не пробивает границы массива перед использованием индекса в массиве. Возможно, вам понадобится функция, чтобы справиться с этим.

void assign_if(Type & neighbour, int x, int y)
{
    if(x >= 0 && x < width && y >= 0 && y < height)
    neighbour = tiles[x][y];
}

и назовите его

assign_if(neighbours[0], x, y+1);

и позже

assign_if(neighbours[0], x-1, y-1);

Редактировать: украсть это у Боба для полноты

Невозможно вернуть сырой массив из функции. Массив выходит из области видимости и указатель на него становится недействительным. Либо передайте массив в качестве другого параметра, либо используйте std::array или std::vector , оба из которых могут быть возвращены. Благодаря Copy Elision умный компилятор, вероятно, уменьшит затраты на копирование.

Пример:

std::array TileManager::GetNeighbours(int x, int y)
{
    std::array neighbours;
    ...
    return neighbours;
}

Редактировать по оригинальному постеру. Вот мое решение:

std::array TileManager::GetNeighbours(int c, int r)
{
    std::array neighbours;

    const int y[] = { -1, -1, -1,  1, 1, 1,  0, 0 };// 8 shifts to neighbors
    const int x[] = { -1,  0,  1, -1, 0, 1, -1, 1 };// used in functions 

    for (int i = 0; i < 8; ++i)// visit the 8 spaces around it
        if (inField(r + y[i], c + x[i]))
            neighbours[i] = tiles[r + y[i]][c + x[i]];
        else
            neighbours[i] = Tile::Type::Void;

    return neighbours;
}

bool TileManager::inField(int r, int c)
{
    if (r < 0 || r >= 25) return false;
    if (c < 0 || c >= 25) return false;
    return true;
}

Редактировать: Caveat

Этот ответ напрямую связан с решением поставленной задачи. Смотрите ответ Kaz для описания более практичного решения, которое торгует немного памяти, чтобы полностью исключить необходимость тестирования и генерации массива neighbours.

13
задан Sukumar 19 February 2009 в 06:57
поделиться

2 ответа

Amazon S3 реализован с помощью архитектуры, описанной в Газете Динамо:

http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html

Бумага объясняет последовательное хеширование, и как и почему гарантия является "возможной непротиворечивостью".

Разрешение конфликтов, о котором они говорят для Динамо, не выставляется пользователям S3. Это используется внутренне в приложениях Amazon, но для S3, единственное разрешение конфликтов является последними победами записи.

Править: Werner Vogels сказал, что "Динамо непосредственно не выставляется внешне как веб-сервис; однако, Динамо и подобные технологии Amazon привыкли к частям питания нашей Amazon Web Services, таким как S3". http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html

Я подчеркнул бы, что он не говорит, что компоненты доли S3 и Динамо, явно говорит, что само Динамо является одной из технологий то питание S3. Все, что я видел от S3, включая протесты, составляется путем предположения, что S3 является необычной оберткой веб-сервисов вокруг Динамо с аутентификацией, учетом и твердостью конфликта последних побед записи, которая невидима для пользователя.

Исходный вопрос был о механизме базовой системы хранения для S3. Это - явно не распределенная файловая система как HDFS или нереляционная база данных как CouchDB. Динамо исполняет эту роль.

4
ответ дан 2 December 2019 в 01:49
поделиться

Это ближе к 2, хотя с содержимым, сохраненным как «BLOB», без заботы о системе о содержании, в то время как CouchDB делает. Внутреннее хранилище использует локальную БД (BDB?) Для узлов кластеров, используемых для хранения нескольких копий. Чтения могут идти на любой узел, имеющий копию, как и записи, но записи должны быть разрешены, чтобы избавиться от конфликтов. Как упоминает Кевин, это гарантирует «возможную согласованность», но не дает строгих гарантий того, когда или какой выигрыш при записи (из внешнего POV; внутренне это определено).

Чтение документов Dynamo полезно для понимания многих концепций, но Реализация AFAIK отличается. Динамо используется внутри Amazon для других целей. Есть также реализации с открытым исходным кодом обоих; CouchDB, очевидно, тоже очень интересен.

1
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: