Skip to content

Commit e5ed43e

Browse files
Support data member inquiry functions
1 parent 96ca55e commit e5ed43e

File tree

9 files changed

+236
-771
lines changed

9 files changed

+236
-771
lines changed

include/fenix.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,10 +610,23 @@ int Fenix_Data_subset_createv(int num_blocks, int *array_start_offsets,
610610
*/
611611
int Fenix_Data_subset_delete(Fenix_Data_subset *subset_specifier);
612612

613-
//!@unimplemented Get the number of members in a data group.
613+
/**
614+
* @brief Get the number of members in a data group.
615+
*
616+
* @param[in] group_id The group to query
617+
* @param[out] number_of_members Number of members in the group
618+
*/
614619
int Fenix_Data_group_get_number_of_members(int group_id, int *number_of_members);
615620

616-
//!@unimplemented Get member ID based on member index
621+
/**
622+
* @brief Get member ID based on member index
623+
*
624+
* See #Fenix_Data_group_get_number_of_members
625+
*
626+
* @param[in] group_id The group to query
627+
* @param[out] member_id The member id at this index in the group
628+
* @param[in] position The position to check, [0, number_of_members)
629+
*/
617630
int Fenix_Data_group_get_member_at_position(int group_id, int *member_id,
618631
int position);
619632

include/fenix_data_group.hpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060

6161
#include <mpi.h>
6262
#include "fenix.h"
63+
#include "fenix_ext.hpp"
6364
#include "fenix_data_member.hpp"
6465
#include "fenix_data_packet.hpp"
6566
#include "fenix_util.hpp"
@@ -71,6 +72,13 @@ typedef struct __fenix_group_vtbl fenix_group_vtbl_t;
7172
typedef struct __fenix_group fenix_group_t;
7273

7374

75+
namespace Fenix::Data {
76+
77+
using member_iterator = std::pair<int, fenix_member_entry_t*>;
78+
79+
} //end namespace Fenix::Data
80+
81+
7482
//This defines the functions which must be implemented by the group
7583
typedef struct __fenix_group_vtbl {
7684
int (*group_delete)(fenix_group_t* group);
@@ -140,7 +148,12 @@ typedef struct __fenix_group {
140148
int timestamp;
141149
int depth;
142150
int policy_name;
143-
fenix_member_t *member;
151+
std::vector<fenix_member_entry_t> members;
152+
153+
//Search for id, returning {-1, nullptr} if not found.
154+
Fenix::Data::member_iterator search_member(int id);
155+
//As search_member, but print an error message is id not found.
156+
Fenix::Data::member_iterator find_member(int id);
144157
} fenix_group_t;
145158

146159
typedef struct __fenix_data_recovery {
@@ -172,4 +185,12 @@ int __fenix_search_groupid( int key, fenix_data_recovery_t *dr);
172185

173186
int __fenix_find_next_group_position( fenix_data_recovery_t *dr );
174187

188+
namespace Fenix::Data {
189+
190+
using group_iterator = std::pair<int, fenix_group_t*>;
191+
192+
group_iterator find_group(int id, fenix_data_recovery_t *dr = fenix.data_recovery);
193+
194+
} //end namespace Fenix::Data
195+
175196
#endif // FENIX_DATA_GROUP_H

include/fenix_data_member.hpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,42 +63,32 @@
6363

6464
#define __FENIX_DEFAULT_MEMBER_SIZE 512
6565

66+
typedef struct __fenix_group fenix_group_t;
67+
6668
typedef struct __fenix_member_entry {
67-
int memberid;
69+
int memberid = -1;
6870
enum states state;
69-
void *user_data;
71+
void *user_data = nullptr;
7072
int datatype_size;
7173
int current_count;
7274
} fenix_member_entry_t;
7375

74-
typedef struct __fenix_member {
75-
size_t count;
76-
size_t total_size;
77-
fenix_member_entry_t *member_entry;
78-
} fenix_member_t;
79-
8076
typedef struct __member_entry_packet {
8177
int memberid;
8278
int datatype_size;
8379
int current_count;
8480
} fenix_member_entry_packet_t;
8581

86-
fenix_member_t *__fenix_data_member_init( );
87-
void __fenix_data_member_destroy( fenix_member_t *member ) ;
88-
89-
void __fenix_ensure_member_capacity( fenix_member_t *m );
90-
void __fenix_ensure_version_capacity_from_member( fenix_member_t *m );
91-
92-
fenix_member_entry_t* __fenix_data_member_add_entry(fenix_member_t* member,
82+
fenix_member_entry_t* __fenix_data_member_add_entry(fenix_group_t* group,
9383
int memberid, void* data, int count, int datatype_size);
9484

9585
int __fenix_data_member_send_metadata(int groupid, int memberid, int dest_rank);
9686
int __fenix_data_member_recv_metadata(int groupid, int src_rank,
9787
fenix_member_entry_packet_t* packet);
9888

99-
int __fenix_search_memberid(fenix_member_t* member, int memberid);
100-
int __fenix_find_next_member_position(fenix_member_t *m);
89+
int __fenix_search_memberid(fenix_group_t* group, int memberid);
10190

102-
void __fenix_data_member_reinit(fenix_member_t *m, fenix_two_container_packet_t packet,
91+
void __fenix_data_member_reinit(fenix_group_t *group, fenix_two_container_packet_t packet,
10392
enum states mystatus);
93+
10494
#endif // FENIX_DATA_MEMBER_H

include/fenix_ext.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@
6161
#include <vector>
6262
#include "fenix.h"
6363
#include "fenix_opt.hpp"
64-
#include "fenix_data_group.hpp"
6564
#include "fenix_process_recovery.hpp"
6665

66+
typedef struct __fenix_data_recovery fenix_data_recovery_t;
67+
6768
typedef struct {
6869
int num_inital_ranks; // Keeps the global MPI rank ID at Fenix_init
6970
int num_survivor_ranks; // Keeps the global information on the number of survived MPI ranks after failure

src/fenix.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,11 @@ int Fenix_Data_subset_delete(Fenix_Data_subset *subset_specifier) {
161161
}
162162

163163
int Fenix_Data_group_get_number_of_members(int group_id, int *number_of_members) {
164-
return 0;
164+
return __fenix_get_number_of_members(group_id, number_of_members);
165165
}
166166

167167
int Fenix_Data_group_get_member_at_position(int group_id, int *member_id, int position) {
168-
return 0;
168+
return __fenix_get_member_at_position(group_id, member_id, position);
169169
}
170170

171171
int Fenix_Data_group_get_number_of_snapshots(int group_id, int *number_of_snapshots) {

src/fenix_data_group.cpp

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,35 @@
6161
#include "fenix_data_member.hpp"
6262
#include "fenix_data_packet.hpp"
6363

64+
namespace Fenix::Data {
6465

66+
group_iterator find_group(int id, fenix_data_recovery_t* dr){
67+
int index = __fenix_search_groupid(id, dr);
68+
if(index == -1){
69+
debug_print("ERROR: group_id <%d> does not exist\n", id);
70+
return {index, nullptr};
71+
}
72+
return {index, dr->group[index]};
73+
}
74+
75+
} //end namespace Fenix::Data
76+
77+
using namespace Fenix::Data;
78+
79+
member_iterator fenix_group_t::search_member(int id){
80+
for(int i = 0; i < members.size(); i++){
81+
if(members[i].memberid == id){
82+
return {i, &(members[i])};
83+
}
84+
}
85+
return {-1, nullptr};
86+
}
87+
88+
member_iterator fenix_group_t::find_member(int id){
89+
auto it = search_member(id);
90+
if(it.first == -1) debug_print("ERROR group <%d>: member_id <%d> does not exist\n", groupid, id);
91+
return it;
92+
}
6593

6694
/**
6795
* @brief
@@ -85,51 +113,30 @@ fenix_data_recovery_t * __fenix_data_recovery_init() {
85113
}
86114

87115
int __fenix_member_delete(int groupid, int memberid) {
88-
int retval = -1;
89-
int group_index = __fenix_search_groupid(groupid, fenix.data_recovery );
90-
int member_index = -1;
91-
if(group_index !=-1){
92-
member_index = __fenix_search_memberid(fenix.data_recovery->group[group_index]->member, memberid);
93-
}
116+
auto [group_index, group] = find_group(groupid);
117+
if(!group) return FENIX_ERROR_INVALID_GROUPID;
118+
119+
auto [member_index, mentry] = group->find_member(memberid);
120+
if(!mentry) return FENIX_ERROR_INVALID_MEMBERID;
94121

95122
if (fenix.options.verbose == 38) {
96123
verbose_print("c-rank: %d, role: %d, group_index: %d, member_index: %d\n",
97124
__fenix_get_current_rank(fenix.new_world), fenix.role, group_index,
98125
member_index);
99126
}
100127

101-
if (group_index == -1) {
102-
debug_print("ERROR Fenix_Data_member_delete: group_id <%d> does not exist\n",
103-
groupid);
104-
retval = FENIX_ERROR_INVALID_GROUPID;
105-
} else if (member_index == -1) {
106-
debug_print("ERROR Fenix_Data_member_delete: memberid <%d> does not exist\n",
107-
memberid);
108-
retval = FENIX_ERROR_INVALID_MEMBERID;
109-
} else {
110-
fenix_data_recovery_t *data_recovery = fenix.data_recovery;
111-
fenix_group_t *group = (data_recovery->group[group_index]);
112-
113-
retval = group->vtbl.member_delete(group, memberid);
114-
115-
if(retval == FENIX_SUCCESS){
116-
fenix_member_t *member = group->member;
117-
member->count--;
118-
fenix_member_entry_t *mentry = &(member->member_entry[member_index]);
119-
mentry->state = DELETED;
120-
}
128+
int retval = group->vtbl.member_delete(group, memberid);
121129

122-
if (fenix.options.verbose == 38) {
123-
fenix_member_t *member = group->member;
124-
fenix_member_entry_t *mentry = &(member->member_entry[member_index]);
125-
126-
verbose_print("c-rank: %d, role: %d, m-count: %zu, m-state: %d",
127-
__fenix_get_current_rank(fenix.new_world), fenix.role,
128-
member->count, mentry->state);
129-
}
130+
if(retval == FENIX_SUCCESS){
131+
group->members.erase(group->members.begin()+member_index);
132+
}
130133

131-
retval = FENIX_SUCCESS;
134+
if (fenix.options.verbose == 38) {
135+
verbose_print("c-rank: %d, role: %d, m-count: %zu",
136+
__fenix_get_current_rank(fenix.new_world), fenix.role,
137+
group->members.size());
132138
}
139+
133140
return retval;
134141
}
135142

@@ -150,8 +157,10 @@ int __fenix_group_delete_direct(fenix_group_t* group){
150157
return group->vtbl.group_delete(group);
151158
}
152159

153-
int __fenix_data_recovery_remove_group(fenix_data_recovery_t* data_recovery, int group_index){
160+
int __fenix_data_recovery_remove_group(int group_index){
154161
int retval = !FENIX_SUCCESS;
162+
auto data_recovery = fenix.data_recovery;
163+
155164
if(group_index != -1){
156165
for(int index = group_index; index < data_recovery->count-1; index++){
157166
data_recovery->group[index] = data_recovery->group[index+1];
@@ -167,28 +176,21 @@ int __fenix_data_recovery_remove_group(fenix_data_recovery_t* data_recovery, int
167176
* @param group_id
168177
*/
169178
int __fenix_group_delete(int groupid) {
170-
int retval = -1;
171-
int group_index = __fenix_search_groupid(groupid, fenix.data_recovery );
179+
auto [group_index, group] = find_group(groupid);
180+
if(!group) return FENIX_ERROR_INVALID_GROUPID;
172181

173182
if (fenix.options.verbose == 37) {
174183
verbose_print("c-rank: %d, group_index: %d\n",
175184
__fenix_get_current_rank(fenix.new_world), group_index);
176185
}
177186

178-
if (group_index == -1) {
179-
debug_print("ERROR Fenix_Data_group_delete: group_id <%d> does not exist\n", groupid);
180-
retval = FENIX_ERROR_INVALID_GROUPID;
181-
} else {
182-
/* Delete Process */
183-
fenix_data_recovery_t *data_recovery = fenix.data_recovery;
184-
fenix_group_t *group = (data_recovery->group[group_index]);
185-
retval = __fenix_group_delete_direct(group);
186-
187-
if(retval == FENIX_SUCCESS){
188-
retval = __fenix_data_recovery_remove_group(data_recovery, group_index);
189-
}
187+
/* Delete Process */
188+
int retval = __fenix_group_delete_direct(group);
190189

190+
if(retval == FENIX_SUCCESS){
191+
retval = __fenix_data_recovery_remove_group(group_index);
191192
}
193+
192194
return retval;
193195
}
194196

0 commit comments

Comments
 (0)