[sheepdog] [PATCH 1/2] object cache: introduce background pusher to boost flush performance
Liu Yuan
namei.unix at gmail.com
Sun Jan 27 05:26:27 CET 2013
On 01/26/2013 05:23 PM, MORITA Kazutaka wrote:
>> +
>> +/*
>> + * Try to push dirty objects in the background to boost VM flush request such as
>> + * fsync().
>> + *
>> + * This doesn't voliate the flush semantics because the flush request will
>> + * still be served synchronously and guaranteed to drain all the dirty objects.
>> + */
>> +static void do_async_push(struct work *work)
>> +{
>> + struct push_work *pw = container_of(work, struct push_work, work);
>> + struct object_cache *oc = pw->oc;
>> + struct object_cache_entry *entry;
>> +
>> + sd_dprintf("%"PRIx32"\n", oc->vid);
>> +next:
>> + pthread_rwlock_wrlock(&oc->lock);
>> + if (list_empty(&oc->dirty_head)) {
>> + pthread_rwlock_unlock(&oc->lock);
>> + return;
>> + }
>> + entry = list_first_entry(&oc->dirty_head, typeof(*entry), dirty_list);
>> + uatomic_inc(&entry->refcnt);
>> + uatomic_dec(&oc->dirty_count);
>> + pthread_rwlock_unlock(&oc->lock);
>> +
>> + pthread_rwlock_rdlock(&entry->lock);
>> +
>> + assert(push_cache_object(oc->vid, entry_idx(entry), entry->bmap,
>> + !!(entry->idx & CACHE_CREATE_BIT))
>> + == SD_RES_SUCCESS);
>
> We must not call functions with side effects inside assert. The code
> does not compiled if we specify -NDEBUG.
>
>
>> /* Push back all the dirty objects to sheep cluster storage */
>> -static int object_cache_push(struct object_cache *oc)
>> +static int object_cache_sync_push(struct object_cache *oc)
>> {
>> struct object_cache_entry *entry, *t;
>> -
>> int ret = SD_RES_SUCCESS;
>>
>> pthread_rwlock_wrlock(&oc->lock);
>> list_for_each_entry_safe(entry, t, &oc->dirty_head, dirty_list) {
>> - ret = push_cache_object(oc->vid, entry_idx(entry), entry->bmap,
>> - !!(entry->idx & CACHE_CREATE_BIT));
>> - if (ret != SD_RES_SUCCESS)
>> - goto push_failed;
>> + if (uatomic_read(&entry->refcnt) > 0)
>> + /* async pusher has been handling it */
>> + continue;
>> +
>> + assert(push_cache_object(oc->vid, entry_idx(entry), entry->bmap,
>> + !!(entry->idx & CACHE_CREATE_BIT))
>> + == SD_RES_SUCCESS);
>
> Same here.
>
>> diff --git a/sheep/sheep.c b/sheep/sheep.c
>> index 61e166c..06ed685 100644
>> --- a/sheep/sheep.c
>> +++ b/sheep/sheep.c
>> @@ -375,7 +375,8 @@ static int init_work_queues(void)
>> sys->sockfd_wqueue = init_work_queue("sockfd", true);
>> if (is_object_cache_enabled()) {
>> sys->reclaim_wqueue = init_work_queue("reclaim", true);
>> - if (!sys->reclaim_wqueue)
>> + sys->push_wqueue = init_work_queue("push", false);
>
> Shouldn't we use a more descriptive name? We now have many work
> queues and it is becoming harder to understand each role.
>
> Thanks,
>
> Kazutaka
>
I'll drop this patch set because background pusher doesn't help boost
performance but more complicate the code.
Thanks,
Yuan
More information about the sheepdog
mailing list