)]}'
{"engines/ep/src/kv_bucket.cc":[{"author":{"_account_id":1000966,"name":"Dave Rigby","email":"daver@couchbase.com","username":"drigby","avatars":[{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"393fc03275f7ce0d0274bad4e7070e3e230fc85c","unresolved":false,"context_lines":[{"line_number":463,"context_line":"}"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"void KVBucket::deinitialize() {"},{"line_number":466,"context_line":"    // If an outstanding NONIO_TASK (e.g. RespondAmbiguousNotification) is the"},{"line_number":467,"context_line":"    // last thing owning a vBucket pointer then we can\u0027t allow it schedule"},{"line_number":468,"context_line":"    // deferred deletion as this will cause a deadlock when it attempts to"},{"line_number":469,"context_line":"    // recursively lock a mutex in ExecutorPool to schedule the deletion."},{"line_number":470,"context_line":"    auto vBuckets \u003d getVBuckets().getBuckets();"},{"line_number":471,"context_line":"    for (const auto\u0026 vbid : vBuckets) {"},{"line_number":472,"context_line":"        auto vbPtr \u003d getVBucket(vbid);"},{"line_number":473,"context_line":"        vbPtr-\u003esetDeferredDeletion(false);"},{"line_number":474,"context_line":"    }"},{"line_number":475,"context_line":"    ExecutorPool::get()-\u003estopTaskGroup(engine.getTaskable().getGID(),"},{"line_number":476,"context_line":"                                       NONIO_TASK_IDX, stats.forceShutdown);"},{"line_number":477,"context_line":""}],"source_content_type":"text/x-c","patch_set":2,"id":"837779c8_5628eb44","line":474,"range":{"start_line":466,"start_character":0,"end_line":474,"end_character":5},"updated":"2019-06-05 07:38:55.000000000","message":"Not sure this is the correct solution - given we\u0027ve not seen this problem before RespondAmbiguousNotification (there\u0027s plenty of other background tasks), I suspect the problem lies there instead.\n\nOne thing I note is that `RespondAmbiguousNotification` is constructed with `completeBeforeShutdown` set to false - which if true will cause the bucket destruction to be deferred until the task has completed.\n\nAdditionally, `RespondAmbiguousNotification` currently has a shared_ptr to a VBucket, so even when it\u0027s not running it\u0027ll keep the VBucket alive. If we change that to a weak_ptr (only promoted when running), possibly also setting RespondAmbiguousNotification.completeBeforeShutdown\u003d\u003dtrue then we should avoid RespondAmbiguousNotification being the last thing which owns the VBucket.\n\nAlso - we should add a unit test for this to explicitly test for this scenario.","commit_id":"cb241367d91cf73d0f65894192f1bcc0c7c523b8"},{"author":{"_account_id":1004341,"name":"Ben Huddleston","email":"ben.huddleston@couchbase.com","username":"BenHuddleston","avatars":[{"url":"https://www.gravatar.com/avatar/ccb3e7e3b52c3d14e759d1b4c0507a3b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/ccb3e7e3b52c3d14e759d1b4c0507a3b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/ccb3e7e3b52c3d14e759d1b4c0507a3b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/ccb3e7e3b52c3d14e759d1b4c0507a3b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"beeade8bad7f1a6fe936035b662110054c9a0a75","unresolved":false,"context_lines":[{"line_number":463,"context_line":"}"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"void KVBucket::deinitialize() {"},{"line_number":466,"context_line":"    // If an outstanding NONIO_TASK (e.g. RespondAmbiguousNotification) is the"},{"line_number":467,"context_line":"    // last thing owning a vBucket pointer then we can\u0027t allow it schedule"},{"line_number":468,"context_line":"    // deferred deletion as this will cause a deadlock when it attempts to"},{"line_number":469,"context_line":"    // recursively lock a mutex in ExecutorPool to schedule the deletion."},{"line_number":470,"context_line":"    auto vBuckets \u003d getVBuckets().getBuckets();"},{"line_number":471,"context_line":"    for (const auto\u0026 vbid : vBuckets) {"},{"line_number":472,"context_line":"        auto vbPtr \u003d getVBucket(vbid);"},{"line_number":473,"context_line":"        vbPtr-\u003esetDeferredDeletion(false);"},{"line_number":474,"context_line":"    }"},{"line_number":475,"context_line":"    ExecutorPool::get()-\u003estopTaskGroup(engine.getTaskable().getGID(),"},{"line_number":476,"context_line":"                                       NONIO_TASK_IDX, stats.forceShutdown);"},{"line_number":477,"context_line":""}],"source_content_type":"text/x-c","patch_set":2,"id":"01a43a1d_41aaa08f","line":474,"range":{"start_line":466,"start_character":0,"end_line":474,"end_character":5},"in_reply_to":"837779c8_5628eb44","updated":"2019-06-05 11:41:12.000000000","message":"I don\u0027t think we need to set completeBeforeShutdown. If the task owns the vBucket (is already running) it won\u0027t have previously acquired the tMutex in ExecutorPool.","commit_id":"cb241367d91cf73d0f65894192f1bcc0c7c523b8"},{"author":{"_account_id":1000966,"name":"Dave Rigby","email":"daver@couchbase.com","username":"drigby","avatars":[{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"debac07d9b46f6462dc26d70348a18aa5f4686e0","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    bool run(void) {"},{"line_number":255,"context_line":"        auto vbucket \u003d weakVb.lock();"},{"line_number":256,"context_line":"        if (vbucket) {"},{"line_number":257,"context_line":"            TRACE_EVENT1(\"ep-engine/task\","},{"line_number":258,"context_line":"                         \"RespondAmbiguousNotification\","},{"line_number":259,"context_line":"                         \"vb\","}],"source_content_type":"text/x-c","patch_set":4,"id":"d53551fc_f370303c","line":256,"updated":"2019-06-05 12:46:54.000000000","message":"Style: prefer an early return as avoids the extra indent:\n\n if (!vbucket) {\n     return false;\n }","commit_id":"c006b7a42b9372c8df5238f4f2aa4c4555cd5fde"}],"engines/ep/tests/module_tests/evp_store_durability_test.cc":[{"author":{"_account_id":1000966,"name":"Dave Rigby","email":"daver@couchbase.com","username":"drigby","avatars":[{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/514e75a8d75cc1fcdb22433d445ae8f1.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"debac07d9b46f6462dc26d70348a18aa5f4686e0","unresolved":false,"context_lines":[{"line_number":78,"context_line":"/// Note - not single-threaded"},{"line_number":79,"context_line":"class DurabilityRespondAmbiguousTest : public KVBucketTest {"},{"line_number":80,"context_line":"protected:"},{"line_number":81,"context_line":"    void SetUp() {"},{"line_number":82,"context_line":"        // The test should do the SetUp"},{"line_number":83,"context_line":"    }"},{"line_number":84,"context_line":"    void TearDown(){"},{"line_number":85,"context_line":"            // The test should do the TearDown"},{"line_number":86,"context_line":"    };"},{"line_number":87,"context_line":"};"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"void DurabilityEPBucketTest::testPersistPrepare(DocumentState docState) {"}],"source_content_type":"text/x-c","patch_set":4,"id":"2c39dc03_88be1906","line":86,"range":{"start_line":81,"start_character":0,"end_line":86,"end_character":6},"updated":"2019-06-05 12:46:54.000000000","message":"Style: mark overridden virtual methods as `override`","commit_id":"c006b7a42b9372c8df5238f4f2aa4c4555cd5fde"}]}
