1. 21 12月, 2012 3 次提交
  2. 18 12月, 2012 1 次提交
    • A
      rbd: remove linger unconditionally · 61c74035
      Alex Elder 提交于
      In __unregister_linger_request(), the request is being removed
      from the osd client's req_linger list only when the request
      has a non-null osd pointer.  It should be done whether or not
      the request currently has an osd.
      
      This is most likely a non-issue because I believe the request
      will always have an osd when this function is called.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      61c74035
  3. 17 12月, 2012 2 次提交
    • A
      libceph: avoid using freed osd in __kick_osd_requests() · 685a7555
      Alex Elder 提交于
      If an osd has no requests and no linger requests, __reset_osd()
      will just remove it with a call to __remove_osd().  That drops
      a reference to the osd, and therefore the osd may have been free
      by the time __reset_osd() returns.  That function offers no
      indication this may have occurred, and as a result the osd will
      continue to be used even when it's no longer valid.
      
      Change__reset_osd() so it returns an error (ENODEV) when it
      deletes the osd being reset.  And change __kick_osd_requests() so it
      returns immediately (before referencing osd again) if __reset_osd()
      returns *any* error.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      685a7555
    • A
      ceph: don't reference req after put · 7d5f2481
      Alex Elder 提交于
      In __unregister_request(), there is a call to list_del_init()
      referencing a request that was the subject of a call to
      ceph_osdc_put_request() on the previous line.  This is not
      safe, because the request structure could have been freed
      by the time we reach the list_del_init().
      
      Fix this by reversing the order of these lines.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-off-by: NSage Weil <sage@inktank.com>
      7d5f2481
  4. 13 12月, 2012 1 次提交
    • S
      libceph: remove 'osdtimeout' option · 83aff95e
      Sage Weil 提交于
      This would reset a connection with any OSD that had an outstanding
      request that was taking more than N seconds.  The idea was that if the
      OSD was buggy, the client could compensate by resending the request.
      
      In reality, this only served to hide server bugs, and we haven't
      actually seen such a bug in quite a while.  Moreover, the userspace
      client code never did this.
      
      More importantly, often the request is taking a long time because the
      OSD is trying to recover, or overloaded, and killing the connection
      and retrying would only make the situation worse by giving the OSD
      more work to do.
      Signed-off-by: NSage Weil <sage@inktank.com>
      Reviewed-by: NAlex Elder <elder@inktank.com>
      83aff95e
  5. 02 10月, 2012 2 次提交
  6. 31 7月, 2012 5 次提交
  7. 06 7月, 2012 1 次提交
  8. 20 6月, 2012 2 次提交
    • S
      libceph: use con get/put ops from osd_client · 88ed6ea0
      Sage Weil 提交于
      There were a few direct calls to ceph_con_{get,put}() instead of the con
      ops from osd_client.c.  This is a bug since those ops aren't defined to
      be ceph_con_get/put.
      
      This breaks refcounting on the ceph_osd structs that contain the
      ceph_connections, and could lead to all manner of strangeness.
      
      The purpose of the ->get and ->put methods in a ceph connection are
      to allow the connection to indicate it has a reference to something
      external to the messaging system, *not* to indicate something
      external has a reference to the connection.
      
      [elder@inktank.com: added that last sentence]
      Signed-off-by: NSage Weil <sage@newdream.net>
      Reviewed-by: NAlex Elder <elder@inktank.com>
      (cherry picked from commit 0d47766f)
      88ed6ea0
    • A
      libceph: osd_client: don't drop reply reference too early · 680584fa
      Alex Elder 提交于
      In ceph_osdc_release_request(), a reference to the r_reply message
      is dropped.  But just after that, that same message is revoked if it
      was in use to receive an incoming reply.  Reorder these so we are
      sure we hold a reference until we're actually done with the message.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      (cherry picked from commit ab8cb34a)
      680584fa
  9. 06 6月, 2012 6 次提交
    • A
      libceph: make ceph_con_revoke_message() a msg op · 8921d114
      Alex Elder 提交于
      ceph_con_revoke_message() is passed both a message and a ceph
      connection.  A ceph_msg allocated for incoming messages on a
      connection always has a pointer to that connection, so there's no
      need to provide the connection when revoking such a message.
      
      Note that the existing logic does not preclude the message supplied
      being a null/bogus message pointer.  The only user of this interface
      is the OSD client, and the only value an osd client passes is a
      request's r_reply field.  That is always non-null (except briefly in
      an error path in ceph_osdc_alloc_request(), and that drops the
      only reference so the request won't ever have a reply to revoke).
      So we can safely assume the passed-in message is non-null, but add a
      BUG_ON() to make it very obvious we are imposing this restriction.
      
      Rename the function ceph_msg_revoke_incoming() to reflect that it is
      really an operation on an incoming message.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      8921d114
    • A
      libceph: make ceph_con_revoke() a msg operation · 6740a845
      Alex Elder 提交于
      ceph_con_revoke() is passed both a message and a ceph connection.
      Now that any message associated with a connection holds a pointer
      to that connection, there's no need to provide the connection when
      revoking a message.
      
      This has the added benefit of precluding the possibility of the
      providing the wrong connection pointer.  If the message's connection
      pointer is null, it is not being tracked by any connection, so
      revoking it is a no-op.  This is supported as a convenience for
      upper layers, so they can revoke a message that is not actually
      "in flight."
      
      Rename the function ceph_msg_revoke() to reflect that it is really
      an operation on a message, not a connection.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      6740a845
    • A
      libceph: tweak ceph_alloc_msg() · 1c20f2d2
      Alex Elder 提交于
      The function ceph_alloc_msg() is only used to allocate a message
      that will be assigned to a connection's in_msg pointer.  Rename the
      function so this implied usage is more clear.
      
      In addition, make that assignment inside the function (again, since
      that's precisely what it's intended to be used for).  This allows us
      to return what is now provided via the passed-in address of a "skip"
      variable.  The return type is now Boolean to be explicit that there
      are only two possible outcomes.
      
      Make sure the result of an ->alloc_msg method call always sets the
      value of *skip properly.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      1c20f2d2
    • A
      libceph: fully initialize connection in con_init() · 1bfd89f4
      Alex Elder 提交于
      Move the initialization of a ceph connection's private pointer,
      operations vector pointer, and peer name information into
      ceph_con_init().  Rearrange the arguments so the connection pointer
      is first.  Hide the byte-swapping of the peer entity number inside
      ceph_con_init()
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      1bfd89f4
    • S
      libceph: use con get/put ops from osd_client · 0d47766f
      Sage Weil 提交于
      There were a few direct calls to ceph_con_{get,put}() instead of the con
      ops from osd_client.c.  This is a bug since those ops aren't defined to
      be ceph_con_get/put.
      
      This breaks refcounting on the ceph_osd structs that contain the
      ceph_connections, and could lead to all manner of strangeness.
      
      The purpose of the ->get and ->put methods in a ceph connection are
      to allow the connection to indicate it has a reference to something
      external to the messaging system, *not* to indicate something
      external has a reference to the connection.
      
      [elder@inktank.com: added that last sentence]
      Signed-off-by: NSage Weil <sage@newdream.net>
      Reviewed-by: NAlex Elder <elder@inktank.com>
      0d47766f
    • A
      libceph: osd_client: don't drop reply reference too early · ab8cb34a
      Alex Elder 提交于
      In ceph_osdc_release_request(), a reference to the r_reply message
      is dropped.  But just after that, that same message is revoked if it
      was in use to receive an incoming reply.  Reorder these so we are
      sure we hold a reference until we're actually done with the message.
      Signed-off-by: NAlex Elder <elder@inktank.com>
      Reviewed-by: NSage Weil <sage@inktank.com>
      ab8cb34a
  10. 01 6月, 2012 2 次提交
  11. 19 5月, 2012 1 次提交
  12. 17 5月, 2012 5 次提交
  13. 15 5月, 2012 1 次提交
  14. 16 4月, 2012 1 次提交
  15. 11 1月, 2012 1 次提交
  16. 12 11月, 2011 1 次提交
  17. 26 10月, 2011 2 次提交
  18. 17 9月, 2011 1 次提交
    • S
      libceph: fix linger request requeuing · 935b639a
      Sage Weil 提交于
      The r_req_lru_item list node moves between several lists, and that cycle
      is not directly related (and does not begin) with __register_request().
      Initialize it in the request constructor, not __register_request(). This
      fixes later badness (below) when OSDs restart underneath an rbd mount.
      
      Crashes we've seen due to this include:
      
      [  213.974288] kernel BUG at net/ceph/messenger.c:2193!
      
      and
      
      [  144.035274] BUG: unable to handle kernel NULL pointer dereference at 0000000000000048
      [  144.035278] IP: [<ffffffffa036c053>] con_work+0x1463/0x2ce0 [libceph]
      Signed-off-by: NSage Weil <sage@newdream.net>
      935b639a
  19. 01 9月, 2011 1 次提交
  20. 27 7月, 2011 1 次提交