diff --git a/src/cluster_client.cpp b/src/cluster_client.cpp index 7cf6419a..9dc098da 100644 --- a/src/cluster_client.cpp +++ b/src/cluster_client.cpp @@ -695,13 +695,16 @@ resume_3: // Check parent inode auto ino_it = st_cli.inode_config.find(op->cur_inode); while (ino_it != st_cli.inode_config.end() && ino_it->second.parent_id && - INODE_POOL(ino_it->second.parent_id) == INODE_POOL(op->cur_inode)) + INODE_POOL(ino_it->second.parent_id) == INODE_POOL(op->cur_inode) && + // Check for loops + ino_it->second.parent_id != op->inode) { // Skip parents from the same pool ino_it = st_cli.inode_config.find(ino_it->second.parent_id); } if (ino_it != st_cli.inode_config.end() && - ino_it->second.parent_id) + ino_it->second.parent_id && + ino_it->second.parent_id != op->inode) { // Continue reading from the parent inode op->cur_inode = ino_it->second.parent_id; diff --git a/src/osd_primary.cpp b/src/osd_primary.cpp index 52c463bb..edc7c387 100644 --- a/src/osd_primary.cpp +++ b/src/osd_primary.cpp @@ -67,7 +67,9 @@ bool osd_t::prepare_primary_rw(osd_op_t *cur_op) } // Find parents from the same pool. Optimized reads only work within pools while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id && - INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id) + INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id && + // Check for loops + inode_it->second.parent_id != cur_op->req.rw.inode) { chain_size++; inode_it = st_cli.inode_config.find(inode_it->second.parent_id); @@ -123,7 +125,10 @@ bool osd_t::prepare_primary_rw(osd_op_t *cur_op) int chain_num = 0; op_data->read_chain[chain_num++] = cur_op->req.rw.inode; auto inode_it = st_cli.inode_config.find(cur_op->req.rw.inode); - while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id) + while (inode_it != st_cli.inode_config.end() && inode_it->second.parent_id && + INODE_POOL(inode_it->second.parent_id) == pg_it->second.pool_id && + // Check for loops + inode_it->second.parent_id != cur_op->req.rw.inode) { op_data->read_chain[chain_num++] = inode_it->second.parent_id; inode_it = st_cli.inode_config.find(inode_it->second.parent_id);