PG,ReplicatedPG: move write_blocked_by_scrub logic into a helper

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: watchers must grab Connection ref as well

Session refs are not really valid on their own, the
corresponding Connection must remain live for at least
as long as the Session.

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG: only put if we cancel evt in unregister_unconnected_watcher

If we fail to cancel the callback, the callback will fire and
release those resources.

Signed-off-by: Samuel Just <sam.just@inktank.com>
ReplicatedPG:, remove_notify, put session after con

Signed-off-by: Samuel Just <sam.just@inktank.com>
PG,ReplicatedPG: handle_watch_timeout must not write during scrub/degraded

Currently, handle_watch_timeout will gladly write to an object while
that object is degraded or is being scrubbed.  Now, we queue a
callback to be called on scrub completion or finish_degraded_object
to recall handle_watch_timeout.  The callback mechanism assumes that
the registered callbacks assume they will be called with the pg
lock -- and no other locks -- already held.

The callback will release the obc and pg refs unconditionally.  Thus,
we need to replace the unconnected_watchers pointer with NULL to
ensure that unregister_unconnected_watcher fails to cancel the
event and does not release the resources a second time.

Signed-off-by: Samuel Just <sam.just@inktank.com>
OSD: pg might be removed during disconnect_session_watches

We don't hold the osd_lock between the session->watches traversal
and the obc checks.

Signed-off-by: Samuel Just <sam.just@inktank.com>
clarify/correct some of sample.ceph.conf

Signed-off-by: Greg Farnum <greg@inktank.com>
OSD: disconnect_session_watches obc might not be valid after we relock

If disconnect_session_watches races with watch removal, the session
might no longer have a valid obc ref.  In that case, move on to
the next obc.

Note, there is no danger of any obcs being *added* to the session
since the session/connection at this point is dead.

Signed-off-by: Samuel Just <sam.just@inktank.com>
OSD: put connection in disconnect_session_watches as well as the session

obc->watchers now has a ref to the connection as well.  This piece of
disconnect_session_watchers essentially parallels remove_watcher and
should generally do the same thing.

Signed-off-by: Samuel Just <sam.just@inktank.com>
rbd: handle images disappearing while in ls -l

rbd.list() returns a list of names, but nothing stops them from
going away before rbd.open(); check for ENOENT and ignore if that
happens; warn on other errors

Signed-off-by: Dan Mick <dan.mick@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
mon: OSDMonitor: don't allow creation of pools with > 65535 pgs

There are some limitations to the number of possible pg's per pool, and
by allowing the 'osd pool create' command to succeed, we were making room
to some anomalous behavior.

Fixes: #3617

Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
osd: up != acting okay on mkpg

This can happen when:

 - mon sends create pg
 - it gets created
 - osd remaps the pg to a different osd
     but osd does not update pg status to the mon
 - mkpg resent to the new osd

or something along those lines.  It seems unusual, but in the end who
really cares why the mon doesn't know about the pg creation yet.

Note that this check was added in the initial commit where acting/up was
added; there is no specific condition of concern we are protecting against.

Instead, ignore the message.  We'll get a query soon anwyay.

This 'fixes' #3614.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Samuel Just <sam.just@inktank.com>
rbd.py: check for new librbd methods before use

This way attempting to use format 2 images works when you upgrade the
python bindings before librbd, and attempting to use functions
that librbd does not have results in more understandable errors.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
client: Add config option to inject sleep for tick

Testing the tick delay with a fork/suspend is causing
corruption in the lockdep code.  This approach uses
a config option to sleep the tick thread for a number
of seconds, avoiding the entire fork/suspend mess.

Signed-off-by: Sam Lang <sam.lang@inktank.com>
Fix comment in sample.ceph.conf

Signed-off-by: Greg Farnum <greg@inktank.com>
Merge branch 'wip-3610' into next
ReplicatedPG: do not use priority from client op

There are internal ordering requirements which may be sensitive
to assigned priority.  We don't want a mix of priorities from
old clients with priorities from new clients causing trouble.

Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
ReplicatedPG: use default priority for Backfill messages

Backfill messages modify the stats on the replica and therefore
must be sent with the same priority as sub_op_modify to ensure
ordering.  Using recovery_op_priority caused the following
sequence:

1) Primary(1) sends MOSDPGBackfill FINISH with updated stats (v1)
2) Primary(1) sends SubOp modify for new client op with stats (v2)
3) Replica(2) receives SubOp with stats (v2)
4) Replica(2) receives MOSDPGBackfill FINISH with stats (v1)
5) Replica(2) responds and Primary(1) resets pgtemp making
    Replica(2) Primary(2)
6) PG stats on Primary(2) several ops old.

Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
upstart: only start when 'upstart' file exists in daemon dir

We need to distinguish between daemons managed by upstart and sysvinit
(and, eventually, systemd).  Only start daemons when 'upstart' is present.

Note that sysvinit will only start daemons when the 'host = ...' line is
in ceph.conf, so there is a similar "opt-in".

Signed-off-by: Sage Weil <sage@inktank.com>
upstart: make starter jobs consistent

Signed-off-by: Sage Weil <sage@inktank.com>