Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jewel: osd: crash adding snap to purged_snaps in ReplicatedPG::WaitingOnReplicas #9575

Merged
merged 1 commit into from Jun 27, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 1 addition & 7 deletions src/osd/OSD.cc
Expand Up @@ -2885,14 +2885,8 @@ PGPool OSD::_get_pool(int id, OSDMapRef createmap)
assert(0);
}

PGPool p = PGPool(id, createmap->get_pool_name(id),
createmap->get_pg_pool(id)->auid);
PGPool p = PGPool(createmap, id);

const pg_pool_t *pi = createmap->get_pg_pool(id);
p.info = *pi;
p.snapc = pi->get_snap_context();

pi->build_removed_snaps(p.cached_removed_snaps);
dout(10) << "_get_pool " << p.id << dendl;
return p;
}
Expand Down
9 changes: 6 additions & 3 deletions src/osd/PG.cc
Expand Up @@ -157,7 +157,10 @@ void PGPool::update(OSDMapRef map)
info = *pi;
auid = pi->auid;
name = map->get_pool_name(id);
if (pi->get_snap_epoch() == map->get_epoch()) {
bool updated = false;
if ((map->get_epoch() == cached_epoch + 1) &&
(pi->get_snap_epoch() == map->get_epoch())) {
updated = true;
pi->build_removed_snaps(newly_removed_snaps);
interval_set<snapid_t> intersection;
intersection.intersection_of(newly_removed_snaps, cached_removed_snaps);
Expand All @@ -175,14 +178,14 @@ void PGPool::update(OSDMapRef map)
} else {
newly_removed_snaps.clear();
}
cached_epoch = map->get_epoch();
lgeneric_subdout(g_ceph_context, osd, 20)
<< "PGPool::update cached_removed_snaps "
<< cached_removed_snaps
<< " newly_removed_snaps "
<< newly_removed_snaps
<< " snapc " << snapc
<< (pi->get_snap_epoch() == map->get_epoch() ?
" (updated)":" (no change)")
<< (updated ? " (updated)":" (no change)")
<< dendl;
}

Expand Down
14 changes: 12 additions & 2 deletions src/osd/PG.h
Expand Up @@ -165,6 +165,7 @@ struct PGRecoveryStats {
};

struct PGPool {
epoch_t cached_epoch;
int64_t id;
string name;
uint64_t auid;
Expand All @@ -175,8 +176,17 @@ struct PGPool {
interval_set<snapid_t> cached_removed_snaps; // current removed_snaps set
interval_set<snapid_t> newly_removed_snaps; // newly removed in the last epoch

PGPool(int64_t i, const string& _name, uint64_t au)
: id(i), name(_name), auid(au) { }
PGPool(OSDMapRef map, int64_t i)
: cached_epoch(map->get_epoch()),
id(i),
name(map->get_pool_name(id)),
auid(map->get_pg_pool(id)->auid) {
const pg_pool_t *pi = map->get_pg_pool(id);
assert(pi);
info = *pi;
snapc = pi->get_snap_context();
pi->build_removed_snaps(cached_removed_snaps);
}

void update(OSDMapRef map);
};
Expand Down