Skip to content

Commit b8cf80b

Browse files
sadeghsavrootroothamdy-simplyblock
authored
Lvolstore ha snapshot (#37)
* first version for snapshot and clones * add debug * add debug * refactor and add new rpc * rpc fix * add debug * add debug * fix deleting snapshot * fix deleting snapshot * fix deleting snapshot * fix blob open ref * update origblob localy instead reload on snapshot * fix freeze on blob while creating snapshot * fix race condition-add timeout for get leadership back-add timeout for failover * add rpc for set groupid in lvolstore level * add rpc for set groupid in lvolstore level * print blob md from mem * print blob md from mem * enable dump blobs from mem * enable dump blobs from mem * change all lvs on grooupid zero * add ERR logs * add more ERR log * add blobstore leader state- add retry every 10s - empty the queue in delete * add blobstore leader state * close app due to read failed on network outage * Add read error for all md pages on lvolstore update * disable logs * backup * update core image fedora to 41 * update core image fedora to 41 2 * close the app in any problem for lvs update failed * close the app in any problem for lvs update failed * support lvol resize on HA * support lvol resize on HA --------- Co-authored-by: root <[email protected]> Co-authored-by: root <[email protected]> Co-authored-by: hamdy-simplyblock <[email protected]> Co-authored-by: hamdy-simplyblock <[email protected]>
1 parent 0f2d334 commit b8cf80b

File tree

15 files changed

+2084
-435
lines changed

15 files changed

+2084
-435
lines changed

include/spdk/blob.h

+33-5
Original file line numberDiff line numberDiff line change
@@ -370,18 +370,24 @@ void spdk_bs_grow_live(struct spdk_blob_store *bs,
370370
* \param cb_fn Called when the updating is complete.
371371
* \param cb_arg Argument passed to function cb_fn.
372372
*/
373-
void spdk_bs_update_live(struct spdk_blob_store *bs,
373+
void spdk_bs_update_live(struct spdk_blob_store *bs, bool failover,
374374
spdk_bs_op_complete cb_fn, void *cb_arg);
375375

376376
void spdk_blob_failover_unfreaze(struct spdk_blob *blob,
377377
spdk_blob_op_complete cb_fn, void *cb_arg);
378378

379-
void
380-
blob_freeze_on_failover(struct spdk_blob *blob);
379+
int blob_freeze(struct spdk_blob *blob);
380+
int spdk_blob_get_freeze_cnt(struct spdk_blob *blob);
381381

382-
void
383-
spdk_blob_update_failed_cleanup(struct spdk_blob *blob, spdk_blob_op_complete cb_fn, void *cb_arg);
382+
void spdk_blob_unfreeze_cleanup(struct spdk_blob *blob,
383+
spdk_blob_op_with_id_complete cb_fn, void *cb_arg);
384+
385+
void blob_freeze_on_failover(struct spdk_blob *blob);
386+
387+
void spdk_blob_update_failed_cleanup(struct spdk_blob *blob,
388+
spdk_blob_op_complete cb_fn, void *cb_arg);
384389

390+
void spdk_bs_set_leader(struct spdk_blob_store *bs, bool state);
385391
/**
386392
* update a blobstore according to bit array synced.
387393
* Can be used on loaded blobstore, even with opened blobs.
@@ -526,6 +532,15 @@ uint64_t spdk_bs_total_data_cluster_count(struct spdk_blob_store *bs);
526532
*/
527533
spdk_blob_id spdk_blob_get_id(struct spdk_blob *blob);
528534

535+
/**
536+
* Get the blob open ref.
537+
*
538+
* \param blob Blob struct to query.
539+
*
540+
* \return blob open ref.
541+
*/
542+
uint32_t spdk_blob_get_open_ref(struct spdk_blob *blob);
543+
529544
/**
530545
* Get the number of pages allocated to the blob.
531546
*
@@ -696,6 +711,14 @@ int spdk_bs_delete_blob_non_leader(struct spdk_blob_store *bs, struct spdk_blob
696711
void spdk_bs_create_snapshot(struct spdk_blob_store *bs, spdk_blob_id blobid,
697712
const struct spdk_blob_xattr_opts *snapshot_xattrs,
698713
spdk_blob_op_with_id_complete cb_fn, void *cb_arg);
714+
715+
void spdk_bs_update_snapshot_clone(struct spdk_blob_store *bs,
716+
struct spdk_blob *origblob, struct spdk_blob *newblob,
717+
bool leader, bool update_in_progress);
718+
719+
void spdk_bs_update_snapshot_clone_live(struct spdk_blob *origblob, struct spdk_blob *newblob);
720+
721+
void spdk_bs_update_clone(struct spdk_blob *clone);
699722

700723
/**
701724
* Create a clone of specified read-only blob.
@@ -947,6 +970,9 @@ void spdk_blob_open_opts_init(struct spdk_blob_open_opts *opts, size_t opts_size
947970
void spdk_bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid,
948971
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg);
949972

973+
void spdk_bs_open_blob_on_failover(struct spdk_blob_store *bs, spdk_blob_id blobid,
974+
spdk_blob_op_with_handle_complete cb_fn, void *cb_arg);
975+
950976
/**
951977
* Open a blob from the given blobstore with additional options.
952978
*
@@ -972,6 +998,8 @@ void spdk_bs_open_blob_ext(struct spdk_blob_store *bs, spdk_blob_id blobid,
972998
*/
973999
void spdk_blob_resize(struct spdk_blob *blob, uint64_t sz, spdk_blob_op_complete cb_fn,
9741000
void *cb_arg);
1001+
1002+
int spdk_blob_resize_register(struct spdk_blob *blob, uint64_t sz);
9751003

9761004
/**
9771005
* Set blob as read only.

include/spdk/lvol.h

+18-12
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,13 @@ int spdk_lvol_create(struct spdk_lvol_store *lvs, const char *name, uint64_t sz,
204204
*/
205205
void spdk_lvol_create_snapshot(struct spdk_lvol *lvol, const char *snapshot_name,
206206
spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
207+
208+
void spdk_lvol_update_snapshot_clone(struct spdk_lvol *lvol,
209+
struct spdk_lvol *origlvol,
210+
spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
211+
212+
void spdk_lvol_update_clone(struct spdk_lvol *lvol,
213+
spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg);
207214

208215
/**
209216
* Create clone of given snapshot.
@@ -296,24 +303,23 @@ int spdk_lvol_iter_immediate_clones(struct spdk_lvol *lvol, spdk_lvol_iter_cb cb
296303
*/
297304
struct spdk_lvol *spdk_lvol_get_by_uuid(const struct spdk_uuid *uuid);
298305

299-
void
300-
spdk_lvol_update_on_failover(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol);
301-
void
302-
lvol_update_on_failover(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, bool send_msg);
303-
void
304-
spdk_lvs_update_on_failover(struct spdk_lvol_store *lvs);
305-
bool
306-
spdk_lvs_check_active_process(struct spdk_lvol_store *lvs);
307-
void
308-
spdk_lvs_set_failed_on_update(struct spdk_lvol_store *lvs, bool state);
306+
void spdk_lvol_update_on_failover(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, bool send_md_thread);
307+
void lvol_update_on_failover(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, bool send_msg);
308+
void spdk_lvs_update_on_failover(struct spdk_lvol_store *lvs);
309+
void spdk_lvs_check_active_process(struct spdk_lvol_store *lvs);
310+
bool spdk_lvs_nonleader_timeout(struct spdk_lvol_store *lvs);
311+
void spdk_lvs_change_leader_state(uint64_t groupid);
312+
void spdk_lvs_set_groupid(struct spdk_lvol_store *lvs, uint64_t groupid);
313+
void spdk_lvs_set_failed_on_update(struct spdk_lvol_store *lvs, bool state);
309314
/**
310315
* Get the lvol that has a particular UUID.
311316
*
312317
* \param uuid The lvs's UUID.
313318
* \param leader The lvs's flag to set as leader or non leader.
314319
* \return A pointer to the requested lvol on success, else NULL.
315320
*/
316-
void spdk_lvs_set_leader_by_uuid(const struct spdk_uuid *uuid, bool leader);
321+
void spdk_lvs_set_leader(struct spdk_lvol_store *lvs, bool leader);
322+
void spdk_lvol_set_leader_failed_on_update(struct spdk_lvol *lvol);
317323

318324
/**
319325
* Get the lvol that has a particular UUID.
@@ -322,7 +328,7 @@ void spdk_lvs_set_leader_by_uuid(const struct spdk_uuid *uuid, bool leader);
322328
* \param leader The lvs's flag to set as leader or non leader.
323329
* \return A pointer to the requested lvol on success, else NULL.
324330
*/
325-
void spdk_lvol_set_leader_by_uuid(const struct spdk_uuid *uuid, bool leader);
331+
void spdk_lvol_set_leader(struct spdk_lvol *lvol);
326332

327333
/**
328334
* set the leadership for all lvs and lvol.

include/spdk_internal/lvolstore.h

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ struct spdk_lvs_req {
2424
spdk_lvs_op_complete cb_fn;
2525
void *cb_arg;
2626
struct spdk_lvol_store *lvol_store;
27+
struct spdk_poller *poller;
2728
int lvserrno;
2829
};
2930

@@ -84,6 +85,9 @@ struct spdk_lvol_with_handle_req {
8485
void *cb_arg;
8586
FILE *fp;
8687
int lvol_priority_class;
88+
struct spdk_poller *poller;
89+
int force_failure;
90+
int frozen_refcnt;
8791
struct spdk_lvol *lvol;
8892
struct spdk_lvol *origlvol;
8993
};
@@ -120,6 +124,10 @@ struct spdk_lvol_store {
120124
bool leader;
121125
bool update_in_progress;
122126
bool failed_on_update;
127+
int retry_on_update;
128+
uint64_t groupid;
129+
uint64_t leadership_timeout;
130+
uint64_t timeout_trigger;
123131
};
124132

125133
struct spdk_lvol {
@@ -129,6 +137,8 @@ struct spdk_lvol {
129137
spdk_blob_id blob_id;
130138
bool leader;
131139
bool update_in_progress;
140+
// uint64_t timeout_update_bs;
141+
// uint64_t timeout_change_leadership;
132142
bool failed_on_update;
133143
char unique_id[SPDK_LVOL_UNIQUE_ID_MAX];
134144
char name[SPDK_LVOL_NAME_MAX];
@@ -150,6 +160,8 @@ struct lvol_store_bdev *vbdev_lvol_store_next(struct lvol_store_bdev *prev);
150160

151161
void spdk_lvol_resize(struct spdk_lvol *lvol, uint64_t sz, spdk_lvol_op_complete cb_fn,
152162
void *cb_arg);
163+
void spdk_lvol_resize_register(struct spdk_lvol *lvol, uint64_t sz,
164+
spdk_lvol_op_complete cb_fn, void *cb_arg);
153165

154166
int spdk_lvol_register_live(struct spdk_lvol_store *lvs, const char *name, const char *uuid_str, uint64_t blobid,
155167
bool thin_provision, enum lvol_clear_method clear_method, spdk_lvol_op_with_handle_complete cb_fn,

0 commit comments

Comments
 (0)