object expirer raise exception if the target object .ts already reclaimed

Bug #1455221 reported by Hugo Kou
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
OpenStack Object Storage (swift)
Confirmed
Low
Roman Vasilets

Bug Description

Conditions
The object be deleted by application or user before the expired due date then object-replicator's reclaim_age (default in 7 days). And the tombstone (.ts) is already deleted on the disk.
The object-updater does not updater the record in .expiring_objects yet. ( Too many async_pending jobs in queue )
In case of this, object-expirer detects the record in expiring list. So it tries to delete it from disk but actually the object's .ts already deleted by replicator. So the Exception appears in object-expirer daemon. object-expirer keep tries delete the object until object-updater to update the container DB of .expiring_objects/<timestamp_container>/

It's not a bug. The expiring object record will be removed from the container in .expiring_object account eventually by object-updater. But Swift should handle the exception even the .ts removed from disk by replicator.

If your object servers still have lot of resource available, you can tweak the object-updater's interval and concurrency to speed up the update progress. Tweaking these parameters will increase container-server and container disks loading. If you see some more container-server timeout errror in the log. You should tune it back to default.

May 14 11:52:32 localhost object-expirer: Pass completed in 6s; 0 objects expired
May 14 11:52:35 localhost object-expirer: Pass beginning; 1 possible containers; 1 possible objects
May 14 11:52:41 localhost object-expirer: Exception while deleting object 1431561594 1431628520-AUTH_demo/c2/obj4 Unexpected response: 404 Not Found: #012Traceback (most recent call last):#012 File "/usr/lib/pymodules/python2.7/swift/obj/expirer.py", line 255, in delete_object#012 self.delete_actual_object(actual_obj, timestamp)#012 File "/usr/lib/pymodules/python2.7/swift/obj/expirer.py", line 296, in delete_actual_object#012 (2, HTTP_PRECONDITION_FAILED))#012 File "/usr/lib/pymodules/python2.7/swift/common/internal_client.py", line 193, in make_request#012 _('Unexpected response: %s') % resp.status, resp)#012UnexpectedResponse: Unexpected response: 404 Not Found (txn: tx656c38a4754a45f9bb2cf-005554eef9)

Changed in swift:
assignee: nobody → Roman Vasilets (rvasilets)
Revision history for this message
John Dickinson (notmyname) wrote :

Roman, are you still working on this? Do you have a patch in gerrit yet?

I'm marking this "in progress" assuming that you're working on this. Please correct me if I'm wrong

Changed in swift:
status: New → In Progress
Revision history for this message
Roman Vasilets (rvasilets) wrote :

Hi John, I was working on it as a part of my master work at University. But I have some job at work. I will try to finish this because its likely to my to contribute to Swift. Thank you for you time.

Revision history for this message
clayg (clay-gerrard) wrote :

Master still looks like it'd handle this the same:

https://github.com/openstack/swift/blob/097a9083eced36b69d4edbf1fc6130ca8b04bca3/swift/obj/expirer.py#L265

but I think once the tombstone makes it's way to disk one way or another the object is deleted. I'm not sure we need to keep retrying ... when is the status ever going to stop being 404?

Changed in swift:
status: In Progress → Confirmed
importance: Undecided → Low
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix merged to swift (master)

Reviewed: https://review.openstack.org/496534
Committed: https://git.openstack.org/cgit/openstack/swift/commit/?id=cf1a1e89bbca50e285e99d31209c6eac6c697083
Submitter: Zuul
Branch: master

commit cf1a1e89bbca50e285e99d31209c6eac6c697083
Author: Tim Burke <email address hidden>
Date: Wed Aug 23 07:25:09 2017 +0000

    expirer: unexpected responses don't warrant tracebacks

    If you want more information, you need to go check out the *other* node.

    Maybe this should be further refined to only log at debug for specific
    statuses like 404 and 412?

    Partial-Bug: 1688558
    Related-Bug: 1455221
    Change-Id: Ieefd8841154faba40dcf2a03abc5f056bdccd54f

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix proposed to swift (feature/s3api)

Related fix proposed to branch: feature/s3api
Review: https://review.openstack.org/535623

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix merged to swift (feature/s3api)
Download full text (33.3 KiB)

Reviewed: https://review.openstack.org/535623
Committed: https://git.openstack.org/cgit/openstack/swift/commit/?id=271b80d0f51078719de35bf6f75b7e06ac3e5b91
Submitter: Zuul
Branch: feature/s3api

commit 88eea33ccd1875af811b59d15df55e2bffa27f77
Author: Clay Gerrard <email address hidden>
Date: Thu Jan 11 13:36:09 2018 -0800

    Recenter builder test expectation around random variance

    ... in order to make the test pass with more seeds and fail less
    frequently in the gate.

    Change-Id: I059e80af87fd33a3b6c0731fbad62e035215eca5

commit d924fa759967b7cdca0d91f21112725f6099a254
Author: Samuel Merritt <email address hidden>
Date: Tue Jan 16 22:19:09 2018 -0800

    Remove old post-as-copy leftovers from tests.

    Since commit 1e79f828, we don't need to test with post_as_copy=True
    any more since we haven't got post_as_copy at all.

    Change-Id: I9c96ce0b812d877bbe11bdb50eb160d6ffa5933d

commit dfa0c4e604fb931d232395599bd0e7b0f11441ee
Author: Alistair Coles <email address hidden>
Date: Wed Jan 17 12:04:45 2018 +0000

    Preserve expiring object behaviour with old proxy-server

    The related change [1] causes expiring object records to no longer be
    created if the X-Delete-At-Container header is not sent to the object
    server, but old proxies prior to [2] (i.e. releases prior to 1.9.0)
    did not send this header.

    The goal of [1] can be alternatively achieved by making expiring
    object record creation be conditional on the X-Delete-At-Host header.

    [1] Related-Change: I20fc2f42f590fda995814a2fa7ba86019f9fddc1
    [2] Related-Change: Id0873a3f2198ce285fe0b0c777738eff38bc2438

    Change-Id: Ia0081693f01631d3f2a59612308683e939ced76a

commit d707fc7b6d0ceb4556dddfc258c5de8c4baff05c
Author: Clay Gerrard <email address hidden>
Date: Tue Jan 16 16:30:13 2018 -0800

    DRY out tests until the stone bleeds

    Can we go deeper!?

    Change-Id: Ibd3b06542aa1bfcbcb71cc98e6bb21a6a67c12f4

commit ba8f1b1c3786df4e79fc3f9e4747d7cfb9072b6f
Author: Alistair Coles <email address hidden>
Date: Wed Jan 17 15:25:33 2018 +0000

    Fix intermittent unit test failure

    test_check_delete_headers_removes_delete_after was
    failing intermittently due to rounding of float time
    values.

    Change-Id: Ia126ad6988f387bbd2d1f5ddff0a56d457a1fc9b
    Closes-Bug: #1743804

commit e747f94313f315fdf8d8fc01fb0c5aac60c33897
Author: Kota Tsuyuzaki <email address hidden>
Date: Wed Dec 27 14:37:29 2017 +0900

    Fix InternalClient to drain response body if the request fails

    If we don't drain the body, the proxy logging in the internal client
    pipeline will log 499 client disconnect instead of actual error response
    code.

    For error responses, we try to do the most helpful thing using swob's
    closing and caching response body attribute. For non-error responses
    which are returned to the client, we endeavour to keep the app_iter
    intact and unconsumed, trusting expecting the caller to do the right
    thing is the only reasonable interface. We must cleanly close any WSGI
    app_iter which we do not return to the client rega...

tags: added: in-feature-s3api
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix proposed to swift (feature/deep)

Related fix proposed to branch: feature/deep
Review: https://review.openstack.org/535990

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix merged to swift (feature/deep)
Download full text (32.4 KiB)

Reviewed: https://review.openstack.org/535990
Committed: https://git.openstack.org/cgit/openstack/swift/commit/?id=3122895118111b2b11f5ef9d0b3410b337624b1b
Submitter: Zuul
Branch: feature/deep

commit ddb13aa5eab03b6993887eb02260b4bc0b256922
Author: vxlinux <email address hidden>
Date: Sat Jan 20 17:23:35 2018 +0800

    Remove redundant blank space in README.rst

    Change-Id: If347476e3b9185921ff174d3f8170a1c4d0622e8

commit 12f874534925b52f9d1c91580794eb9e5e9a4589
Author: vxlinux <email address hidden>
Date: Fri Jan 19 16:54:26 2018 +0800

    Add Docstrings to validate_replicas_by_tier

    New common functions should have Docstrings

    Change-Id: Icbb3cdf38509fd6d034cbb2271786559780a7b68

commit d2034cd7b6946829a7d95c4d2c71d4322f80e855
Author: Clay Gerrard <email address hidden>
Date: Tue Jan 16 17:03:38 2018 -0800

    Keep object-updater stats logging consistent

    If we're going to encapsulate the stats tracking it seems reasonable if
    we ever add any more metrics we can reduce the number of places we need
    to update log messages.

    Change-Id: I187cf6cfec1e0a9138b709fa298e1991aa809ec4

commit cd2c73fd955317a3f40758cef45ee48bef8fbc79
Author: Tim Burke <email address hidden>
Date: Tue Jan 16 01:07:35 2018 +0000

    internal_client: Don't retry when we expect the same reponse

    This boils down to 404, 412, or 416; or 409 when we provided an
    X-Timestamp.

    This means, among other things, that the expirer won't issue 3 DELETEs
    every cycle for every stale work item.

    Related-Change: Icd63c80c73f864d2561e745c3154fbfda02bd0cc
    Change-Id: Ie5f2d3824e040bbc76d511a54d1316c4c2503732

commit 222df9185782f59ffdc96c3534afaa2fb1361235
Author: chengebj5238 <email address hidden>
Date: Thu Jan 18 17:03:11 2018 +0800

    Modify redirection URL and broken URL

    Change-Id: I9a04cb2fbe61e1fbd8185ab2fac9abbcea4d55cc

commit d1656e334959e09d13eea98c2696e58c77e4ab91
Author: Tim Burke <email address hidden>
Date: Fri Jan 12 13:17:45 2018 -0800

    slo: Send ETag header in 206 responses

    Why weren't we doing that before?? The etag should be the same as for
    GET/HEAD, and by sending it, we can assure resuming clients that they're
    downlading the same object even if they didn't include an If-Match
    header.

    Change-Id: I4ccbd1ae3a909ecb4606ef18211d1b868f5cad86
    Related-Change: Ic11662eb5c7176fbf422a6fc87a569928d6f85a1

commit 88eea33ccd1875af811b59d15df55e2bffa27f77
Author: Clay Gerrard <email address hidden>
Date: Thu Jan 11 13:36:09 2018 -0800

    Recenter builder test expectation around random variance

    ... in order to make the test pass with more seeds and fail less
    frequently in the gate.

    Change-Id: I059e80af87fd33a3b6c0731fbad62e035215eca5

commit f64c00b00aa8df31a937448917421891904abdc8
Author: Samuel Merritt <email address hidden>
Date: Fri Jan 12 07:17:18 2018 -0800

    Improve object-updater's stats logging

    The object updater has five different stats, but its logging only told
    you two of them (successes and failures), and it only told you after
    finishing all the async_pendings for a device. If y...

tags: added: in-feature-deep
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.