  | 21 | 21 | | /* calculate log2 of number */ |
| | 22 | 22 | | static double my_log2(const double n) |
| | 23 | 23 | | { |
  | 24 | | - | return log(n) / log(2); |
| | | 24 | + | return log(n) / log(2.0); |
| 25 | 25 | | } |
| | 26 | 26 | | |
| | 27 | 27 | | /* calculate branch_level for a server from a bitmap */ |
| | 28 | 28 | | static int dist_dir_calc_branch_level( |
  | 29 | | - | const PVFS_dist_dir_attr *dist_dir_attr, const PVFS_dist_dir_bitmap bitmap) |
| | | 29 | + | const PVFS_dist_dir_attr *dist_dir_attr, |
| | | 30 | + | const PVFS_dist_dir_bitmap bitmap) |
| 30 | 31 | | { |
| | 31 | 32 | | int level = 0; |
| | 32 | 33 | | int server_no, num_servers; |
| | 33 | 34 | | |
| | 34 | 35 | | server_no = dist_dir_attr->server_no; |
| | 35 | 36 | | num_servers = dist_dir_attr->num_servers; |
| | 36 | 37 | | |
  | | 38 | + | /* meta handle copy (server_no = -1) shall not reach here */ |
| 37 | 39 | | assert(server_no >= 0 && server_no < num_servers); |
  | | 40 | + | assert(bitmap != NULL); |
| 38 | 41 | | |
| | 39 | 42 | | if(!(TST_BIT(bitmap, server_no))) |
  | | 43 | + | { |
| 40 | 44 | | return -1; /* not an active server */ |
  | | 45 | + | } |
| 41 | 46 | | |
| | 42 | 47 | | /* get the number of bits above which all bits are zero */ |
| | 43 | 48 | | while( server_no >> level ) |
  | | 49 | + | { |
| 44 | 50 | | level++; |
  | | 51 | + | } |
| 45 | 52 | | |
| | 46 | 53 | | /* until no splitting node is set */ |
| | 47 | 54 | | while( TST_BIT(bitmap, server_no + (1l << level)) ) |
  | | 55 | + | { |
| 48 | 56 | | level++; |
  | | 57 | + | } |
| 49 | 58 | | |
| | 50 | 59 | | return level; |
| | 51 | 60 | | } |
| |
|
|
 |
… |
| 55 | 64 | | * ***************************/ |
| | 56 | 65 | | |
| | 57 | 66 | | /* init dir state function, set all parameters |
  | 58 | | - | * server_no <- 0..(num_servers-1) |
| | | 67 | + | * server_no <- -1..(num_servers-1) |
| 59 | 68 | | * pre_dsg_num_server: pre-set a number of servers, used for known large directory. default value can be 1. |
| | 60 | 69 | | */ |
| | 61 | 70 | | |
| | 62 | 71 | | int PINT_init_dist_dir_state( |
  | 63 | | - | PVFS_dist_dir_attr *dist_dir_attr, PVFS_dist_dir_bitmap *bitmap_ptr, |
| | 64 | | - | int num_servers, int server_no, int pre_dsg_num_server) |
| | | 72 | + | PVFS_dist_dir_attr *dist_dir_attr, |
| | | 73 | + | PVFS_dist_dir_bitmap *bitmap_ptr, |
| | | 74 | + | const int num_servers, |
| | | 75 | + | const int server_no, |
| | | 76 | + | int pre_dsg_num_server) |
| 65 | 77 | | { |
| | 66 | 78 | | int i; |
| | 67 | 79 | | |
| | 68 | 80 | | assert(dist_dir_attr != NULL); |
| | 69 | 81 | | |
  | 70 | | - | /* 0 <= server_no < num_servers && 0 < pre_dsg_num_server <= num_servers */ |
| | 71 | | - | if( (num_servers < 1) || |
| | 72 | | - | (server_no < -1) || /* metadata handle has server_no = -1 */ |
| | 73 | | - | (server_no >= num_servers) || |
| | 74 | | - | (pre_dsg_num_server <= 0) || |
| | 75 | | - | (pre_dsg_num_server > num_servers) ) |
| | 76 | | - | return -1; |
| | | 82 | + | /* -1 <= server_no < num_servers && 0 < pre_dsg_num_server <= num_servers */ |
| | | 83 | + | assert( (num_servers < 1) || |
| | | 84 | + | (server_no < -1) || /* metadata handle has server_no = -1 */ |
| | | 85 | + | (server_no >= num_servers)); |
| 77 | 86 | | |
  | | 87 | + | if ((pre_dsg_num_server <= 0) || |
| | | 88 | + | (pre_dsg_num_server > num_servers)) |
| | | 89 | + | { |
| | | 90 | + | pre_dsg_num_server = num_servers; |
| | | 91 | + | } |
| | | 92 | + | |
| 78 | 93 | | dist_dir_attr->num_servers = num_servers; |
| | 79 | 94 | | dist_dir_attr->server_no = server_no; |
  | 80 | | - | dist_dir_attr->tree_height = (int)ceil(my_log2((double)num_servers)); /* tree_height start from 0 */ |
| | | 95 | + | /* tree_height start from 0 */ |
| | | 96 | + | dist_dir_attr->tree_height = (int)ceil(my_log2((double)num_servers)); |
| 81 | 97 | | |
| | 82 | 98 | | /* increase bitmap_size if 2^tree_height > 32 |
| | 83 | 99 | | * bitmap has at least 2^tree_height bits, that is, the number of leaves of a full tree. */ |
| | 84 | 100 | | if( (1l << dist_dir_attr->tree_height) > |
| | 85 | 101 | | (sizeof(PVFS_dist_dir_bitmap_basetype) * 8)) |
  | | 102 | + | { |
| 86 | 103 | | dist_dir_attr->bitmap_size = ((1l << dist_dir_attr->tree_height) >> 5); |
  | | 104 | + | } |
| 87 | 105 | | else |
  | | 106 | + | { |
| 88 | 107 | | dist_dir_attr->bitmap_size = 1; |
  | | 108 | + | } |
| 89 | 109 | | |
| | 90 | 110 | | *bitmap_ptr = (PVFS_dist_dir_bitmap) malloc( |
| | 91 | 111 | | dist_dir_attr->bitmap_size * sizeof(PVFS_dist_dir_bitmap_basetype)); |
| | 92 | 112 | | if ((*bitmap_ptr) == NULL) |
  | | 113 | + | { |
| 93 | 114 | | return -1; |
  | | 115 | + | } |
| 94 | 116 | | |
| | 95 | 117 | | memset((*bitmap_ptr), 0, |
| | 96 | 118 | | dist_dir_attr->bitmap_size * sizeof(PVFS_dist_dir_bitmap_basetype)); |
| | 97 | 119 | | |
| | 98 | 120 | | for(i = pre_dsg_num_server-1; i >= 0; i--) |
  | | 121 | + | { |
| 99 | 122 | | SET_BIT((*bitmap_ptr), i); |
  | | 123 | + | } |
| 100 | 124 | | |
  | 101 | | - | dist_dir_attr->branch_level = dist_dir_calc_branch_level(dist_dir_attr, *bitmap_ptr); |
| | | 125 | + | if(server_no > -1) /* an dirdata server */ |
| | | 126 | + | { |
| | | 127 | + | dist_dir_attr->branch_level = dist_dir_calc_branch_level(dist_dir_attr, *bitmap_ptr); |
| | | 128 | + | } |
| | | 129 | + | else /* a meta server */ |
| | | 130 | + | { |
| | | 131 | + | dist_dir_attr->branch_level = -1; |
| | | 132 | + | } |
| 102 | 133 | | |
| | 103 | 134 | | /* set split size */ |
| | 104 | 135 | | dist_dir_attr->split_size = PVFS_DIST_DIR_MAX_ENTRIES; |
| |
|
|
 |
… |
| 112 | 143 | | * hash can be any value, whose rightmost several bits will be examined. |
| | 113 | 144 | | */ |
| | 114 | 145 | | int PINT_find_dist_dir_bucket( |
  | 115 | | - | PVFS_dist_dir_hash_type hash, PVFS_dist_dir_attr *dist_dir_attr, |
| | 116 | | - | PVFS_dist_dir_bitmap bitmap) |
| | | 146 | + | const PVFS_dist_dir_hash_type hash, |
| | | 147 | + | const PVFS_dist_dir_attr *const dist_dir_attr, |
| | | 148 | + | const PVFS_dist_dir_bitmap bitmap) |
| 117 | 149 | | { |
| | 118 | 150 | | PVFS_dist_dir_hash_type node_val; |
| | 119 | 151 | | int level; |
| | 120 | 152 | | |
| | 121 | 153 | | assert(dist_dir_attr != NULL); |
  | | 154 | + | assert(bitmap != NULL); |
| 122 | 155 | | |
| | 123 | 156 | | level = dist_dir_attr->tree_height; |
| | 124 | 157 | | |
| | 125 | 158 | | if(level < 0) |
  | | 159 | + | { |
| 126 | 160 | | return -1; |
  | | 161 | + | } |
| 127 | 162 | | |
| | 128 | 163 | | for( node_val = hash & ((1l << level) - 1); /* use the rightmost 'tree_height' bits */ |
| | 129 | 164 | | (level >= 0) && !(TST_BIT(bitmap, node_val)); /* test if node_val bit is set */ |
| |
|
|
 |
… |
| 137 | 172 | | * this code return the index of the new node when a bucket is to be split |
| | 138 | 173 | | */ |
| | 139 | 174 | | int PINT_find_dist_dir_split_node( |
  | 140 | | - | PVFS_dist_dir_attr *dist_dir_attr, PVFS_dist_dir_bitmap bitmap) |
| | | 175 | + | const PVFS_dist_dir_attr *const dist_dir_attr, |
| | | 176 | + | const PVFS_dist_dir_bitmap bitmap) |
| 141 | 177 | | { |
| | 142 | 178 | | int new_node_val; |
  | | 179 | + | int branch_level; |
| 143 | 180 | | |
  | 144 | | - | assert(dist_dir_attr != NULL); |
| | | 181 | + | assert((dist_dir_attr != NULL) && |
| | | 182 | + | (dist_dir_attr->server_no > -1) && |
| | | 183 | + | (bitmap != NULL)); |
| 145 | 184 | | |
  | | 185 | + | branch_level = dist_dir_attr->branch_level; |
| | | 186 | + | |
| | | 187 | + | /* meta server or inactive dirdata server should not come here */ |
| | | 188 | + | assert(branch_level > -1); |
| | | 189 | + | |
| 146 | 190 | | /* if it reaches the maximum tree height */ |
  | 147 | | - | if (dist_dir_attr->branch_level >= dist_dir_attr->tree_height) |
| | | 191 | + | if (branch_level >= dist_dir_attr->tree_height) |
| | | 192 | + | { |
| 148 | 193 | | return -1; |
  | | 194 | + | } |
| 149 | 195 | | |
| | 150 | 196 | | /* calculate new node value */ |
  | 151 | | - | new_node_val = dist_dir_attr->server_no + (1l << dist_dir_attr->branch_level); |
| | | 197 | + | new_node_val = dist_dir_attr->server_no |
| | | 198 | + | + (1l << branch_level); |
| 152 | 199 | | if(new_node_val >= dist_dir_attr->num_servers) |
  | | 200 | + | { |
| 153 | 201 | | return -1; |
  | | 202 | + | } |
| 154 | 203 | | |
  | | 204 | + | /* new node must be unset, otherwise branch_level is messed up */ |
| | | 205 | + | assert(!TST_BIT(bitmap, new_node_val)); |
| | | 206 | + | |
| 155 | 207 | | return new_node_val; |
| | 156 | 208 | | } |
| | 157 | 209 | | |
| | 158 | 210 | | /* |
| | 159 | 211 | | * update current bitmap tree and re-calculate branch_level |
| | 160 | 212 | | */ |
| | 161 | 213 | | int PINT_update_dist_dir_bitmap_from_bitmap( |
  | 162 | | - | PVFS_dist_dir_attr *to_dir_attr, PVFS_dist_dir_bitmap to_dir_bitmap, |
| | 163 | | - | const PVFS_dist_dir_attr *from_dir_attr, const PVFS_dist_dir_bitmap from_dir_bitmap) |
| | | 214 | + | PVFS_dist_dir_attr *to_dir_attr, |
| | | 215 | + | PVFS_dist_dir_bitmap to_dir_bitmap, |
| | | 216 | + | const PVFS_dist_dir_attr *from_dir_attr, |
| | | 217 | + | const PVFS_dist_dir_bitmap from_dir_bitmap) |
| 164 | 218 | | { |
| | 165 | 219 | | int i; |
| | 166 | 220 | | |
| | 167 | 221 | | assert((to_dir_attr != NULL) && (from_dir_attr != NULL)); |
  | | 222 | + | assert((to_dir_bitmap != NULL) && (from_dir_bitmap != NULL)); |
| 168 | 223 | | |
| | 169 | 224 | | if( (to_dir_attr->num_servers != from_dir_attr->num_servers) || |
| | 170 | 225 | | (to_dir_attr->server_no == from_dir_attr->server_no)) |
  | | 226 | + | { |
| 171 | 227 | | return -1; /* not in the same tree or update itself */ |
  | | 228 | + | } |
| 172 | 229 | | |
| | 173 | 230 | | /* bitmap is with a type of (uint32_t *) |
| | 174 | 231 | | */ |
| | 175 | 232 | | for(i = to_dir_attr->bitmap_size - 1; |
  | 176 | | - | i >= 0; i--) { |
| | | 233 | + | i >= 0; i--) |
| | | 234 | + | { |
| 177 | 235 | | to_dir_bitmap[i] |= from_dir_bitmap[i]; |
| | 178 | 236 | | } |
| | 179 | 237 | | |
| | 180 | 238 | | /* update branch level */ |
  | | 239 | + | if(to_dir_attr->server_no > -1) /* dirdata server */ |
| | | 240 | + | { |
| 181 | 241 | | to_dir_attr->branch_level = dist_dir_calc_branch_level(to_dir_attr, to_dir_bitmap); |
  | | 242 | + | } |
  | 182 | 243 | | |
| | 183 | 244 | | /* anything else to update? */ |
| | 184 | 245 | | |