@@ -4079,9 +4079,12 @@ DECLARE_THREAD(pm_flusher_worker)(
4079
4079
{
4080
4080
// ***this call aio_batch ***
4081
4081
#if defined(UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4082
- printf (" in flusher thread, pointer id=%zu, list_id =%zu\n " , i, plist->list_id );
4082
+ printf (" \n [2] BEGIN ( in flusher thread) , pointer id=%zu, list_id =%zu\n " , i, plist->list_id );
4083
4083
#endif
4084
4084
pm_buf_flush_list (gb_pmw->pop , gb_pmw->pbuf , plist);
4085
+ #if defined(UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4086
+ printf (" \n [2] END (in flusher thread), pointer id=%zu, list_id =%zu\n " , i, plist->list_id );
4087
+ #endif
4085
4088
flusher->n_requested --;
4086
4089
os_event_set (flusher->is_req_full );
4087
4090
// we can set the pointer to null after the pm_buf_flush_list finished
@@ -4143,6 +4146,10 @@ pm_handle_finished_block_with_flusher(
4143
4146
TOID_ASSIGN (flush_list, pblock->list .oid );
4144
4147
PMEM_BUF_BLOCK_LIST* pflush_list = D_RW (flush_list);
4145
4148
4149
+ PMEM_BUF_BLOCK_LIST* pnext_list;
4150
+ PMEM_BUF_BLOCK_LIST* pprev_list;
4151
+
4152
+
4146
4153
assert (pflush_list);
4147
4154
4148
4155
pmemobj_rwlock_wrlock (pop, &pflush_list->lock );
@@ -4153,7 +4160,10 @@ pm_handle_finished_block_with_flusher(
4153
4160
pflush_list->n_aio_pending --;
4154
4161
4155
4162
if (pflush_list->n_aio_pending + pflush_list->n_sio_pending == 0 ) {
4156
- // printf("\n [begin finish AIO list %zu\n", pflush_list->list_id);
4163
+ #if defined (UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4164
+ printf (" \n [*****[4] BEGIN finish AIO list %zu hashed_id %zu\n " ,
4165
+ pflush_list->list_id , pflush_list->hashed_id );
4166
+ #endif
4157
4167
// Now all pages in this list are persistent in disk
4158
4168
// (0) flush spaces
4159
4169
pm_buf_flush_spaces_in_list (pop, buf, pflush_list);
@@ -4179,21 +4189,74 @@ pm_handle_finished_block_with_flusher(
4179
4189
4180
4190
// (2) Remove this list from the doubled-linked list
4181
4191
// assert( !TOID_IS_NULL(pflush_list->prev_list) );
4182
- if ( !TOID_IS_NULL (pflush_list->prev_list ) ) {
4183
- // if (is_lock_prev_list)
4184
- // pmemobj_rwlock_wrlock(pop, &D_RW(pflush_list->prev_list)->lock);
4185
- TOID_ASSIGN ( D_RW (pflush_list->prev_list )->next_list , pflush_list->next_list .oid );
4186
- // if (is_lock_prev_list)
4187
- // pmemobj_rwlock_unlock(pop, &D_RW(pflush_list->prev_list)->lock);
4188
- }
4192
+
4193
+ pnext_list = D_RW (pflush_list->next_list );
4194
+ pprev_list = D_RW (pflush_list->prev_list );
4189
4195
4190
- if (!TOID_IS_NULL (pflush_list->next_list ) ) {
4191
- // pmemobj_rwlock_wrlock(pop, &D_RW(pflush_list->next_list)->lock);
4196
+ if (pprev_list != NULL &&
4197
+ D_RW (pprev_list->next_list ) != NULL &&
4198
+ D_RW (pprev_list->next_list )->list_id == pflush_list->list_id ){
4192
4199
4193
- TOID_ASSIGN (D_RW (pflush_list->next_list )->prev_list , pflush_list->prev_list .oid );
4200
+ if (pnext_list == NULL ) {
4201
+ TOID_ASSIGN (pprev_list->next_list , OID_NULL);
4202
+ }
4203
+ else {
4204
+ TOID_ASSIGN (pprev_list->next_list , (pflush_list->next_list ).oid );
4205
+ }
4206
+ }
4194
4207
4195
- // pmemobj_rwlock_unlock(pop, &D_RW(pflush_list->next_list)->lock);
4208
+ if (pnext_list != NULL &&
4209
+ D_RW (pnext_list->prev_list ) != NULL &&
4210
+ D_RW (pnext_list->prev_list )->list_id == pflush_list->list_id ) {
4211
+ if (pprev_list == NULL ) {
4212
+ TOID_ASSIGN (pnext_list->prev_list , OID_NULL);
4213
+ }
4214
+ else {
4215
+ #if defined (UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4216
+ printf (" [4] !!!!! handle finish, cur_list_id %zu " ,
4217
+ pflush_list->list_id );
4218
+ printf (" [4] !!!! has next_list_id %zu " , pnext_list->list_id );
4219
+ printf (" [4] !!!! has prev_list_id %zu \n " , pprev_list->list_id );
4220
+ #endif
4221
+ TOID_ASSIGN (pnext_list->prev_list , (pflush_list->prev_list ).oid );
4222
+ }
4196
4223
}
4224
+
4225
+ // if( !TOID_IS_NULL(pflush_list->prev_list) &&
4226
+ // D_RW(pflush_list->prev_list) != NULL &&
4227
+ // D_RW(D_RW(pflush_list->prev_list)->next_list) != NULL ) {
4228
+ // //if (is_lock_prev_list)
4229
+ // //pmemobj_rwlock_wrlock(pop, &D_RW(pflush_list->prev_list)->lock);
4230
+ // if (D_RW(pflush_list->next_list) == NULL) {
4231
+ // TOID_ASSIGN( D_RW(pflush_list->prev_list)->next_list, OID_NULL);
4232
+ // }
4233
+ // else {
4234
+ // TOID_ASSIGN( D_RW(pflush_list->prev_list)->next_list, pflush_list->next_list.oid);
4235
+ // }
4236
+ // //if (is_lock_prev_list)
4237
+ // //pmemobj_rwlock_unlock(pop, &D_RW(pflush_list->prev_list)->lock);
4238
+ // }
4239
+
4240
+ // This case is rarely, can occur bug if happen
4241
+ // if (!TOID_IS_NULL(pflush_list->next_list) &&
4242
+ // D_RW(pflush_list->next_list) != NULL &&
4243
+ // D_RW(D_RW(pflush_list->next_list)->prev_list) != NULL ) {
4244
+ // //pmemobj_rwlock_wrlock(pop, &D_RW(pflush_list->next_list)->lock);
4245
+ // if ( D_RW(pflush_list->prev_list) == NULL) {
4246
+ // TOID_ASSIGN( D_RW(pflush_list->next_list)->prev_list, OID_NULL);
4247
+ // }
4248
+ // else {
4249
+ // #if defined (UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4250
+ // printf("[4] !!!!! handle finish, cur_list_id %zu ",
4251
+ // pflush_list->list_id);
4252
+ // printf ("[4] !!!! has next_list_id %zu ", D_RW(pflush_list->next_list)->list_id);
4253
+ // printf ("[4] !!!! has prev_list_id %zu \n", D_RW(pflush_list->prev_list)->list_id);
4254
+ // #endif
4255
+ // TOID_ASSIGN(D_RW(pflush_list->next_list)->prev_list, pflush_list->prev_list.oid);
4256
+ // }
4257
+
4258
+ // //pmemobj_rwlock_unlock(pop, &D_RW(pflush_list->next_list)->lock);
4259
+ // }
4197
4260
4198
4261
TOID_ASSIGN (pflush_list->next_list , OID_NULL);
4199
4262
TOID_ASSIGN (pflush_list->prev_list , OID_NULL);
@@ -4202,15 +4265,16 @@ pm_handle_finished_block_with_flusher(
4202
4265
PMEM_BUF_FREE_POOL* pfree_pool;
4203
4266
pfree_pool = D_RW (buf->free_pool );
4204
4267
4205
- // printf("PMEM_DEBUG: in fil_aio_wait(), try to lock free_pool list id: %zd, cur_lists in free_pool= %zd \n", pflush_list->list_id, pfree_pool->cur_lists);
4206
4268
pmemobj_rwlock_wrlock (pop, &pfree_pool->lock );
4207
4269
4208
4270
POBJ_LIST_INSERT_TAIL (pop, &pfree_pool->head , flush_list, list_entries);
4209
4271
pfree_pool->cur_lists ++;
4210
4272
// wakeup who is waitting for free_pool available
4211
4273
os_event_set (buf->free_pool_event );
4212
4274
4213
- // printf("end finish AIO List %zu]", pflush_list->list_id);
4275
+ #if defined (UNIV_PMEMOBJ_BUF_RECOVERY_DEBUG)
4276
+ printf (" \n *****[4] END finish AIO List %zu]\n " , pflush_list->list_id );
4277
+ #endif
4214
4278
pmemobj_rwlock_unlock (pop, &pfree_pool->lock );
4215
4279
}
4216
4280
// the list has some unfinished aio
0 commit comments