Debug transaction status

This commit is contained in:
Vivek Kumar Dutta 2023-08-21 12:07:17 +05:30
parent 0171e092b9
commit aa8af74249
No known key found for this signature in database
GPG key ID: 65C818099F37097D
4 changed files with 30 additions and 25 deletions

View file

@ -568,7 +568,7 @@ int bbfdm_set_handler(struct ubus_context *ctx, struct ubus_object *obj,
if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction
trans_id = transaction_start(0);
trans_id = transaction_start("INT_SET", 0);
if (trans_id == 0) {
WARNING("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR);
@ -685,7 +685,7 @@ int bbfdm_add_handler(struct ubus_context *ctx, struct ubus_object *obj,
if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction
trans_id = transaction_start(0);
trans_id = transaction_start("INT_ADD", 0);
if (trans_id == 0) {
ERR("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR);
@ -805,7 +805,7 @@ int bbfdm_del_handler(struct ubus_context *ctx, struct ubus_object *obj,
if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction
trans_id = transaction_start(0);
trans_id = transaction_start("INT_DEL", 0);
if (trans_id == 0) {
WARNING("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR);
@ -875,21 +875,20 @@ static int bbfdm_transaction_handler(struct ubus_context *ctx, struct ubus_objec
is_service_restart = blobmsg_get_bool(tb[TRANS_RESTART]);
fill_optional_data(&data, tb[TRANS_OPTIONAL]);
if (!is_str_eq(trans_cmd, "start") && data.trans_id == 0)
return UBUS_STATUS_INVALID_ARGUMENT;
INFO("ubus method|%s|, name|%s|", method, obj->name);
INFO("ubus method|%s|, name|%s|, cmd [%s]", method, obj->name, trans_cmd);
bbf_init(&data.bbf_ctx);
blob_buf_init(&data.bb, 0);
if (is_str_eq(trans_cmd, "start")) {
ret = transaction_start(max_timeout);
ret = transaction_start("API", max_timeout);
if (ret) {
blobmsg_add_u8(&data.bb, "status", true);
blobmsg_add_u32(&data.bb, "transaction_id", ret);
} else {
blobmsg_add_u8(&data.bb, "status", false);
transaction_status(&data.bb);
}
} else if (is_str_eq(trans_cmd, "commit")) {
ret = transaction_commit(data.trans_id, &data.bb, is_service_restart);
@ -898,7 +897,7 @@ static int bbfdm_transaction_handler(struct ubus_context *ctx, struct ubus_objec
ret = transaction_abort(data.trans_id, &data.bb);
blobmsg_add_u8(&data.bb, "status", (ret == 0));
} else if (is_str_eq(trans_cmd, "status")) {
transaction_status(&data.bb, data.trans_id);
transaction_status(&data.bb);
} else {
WARNING("method(%s) not supported", method);
}

View file

@ -76,6 +76,9 @@ int get_resolved_paths(struct dmctx *bbf_ctx, char *qpath, struct list_head *res
// strncpy with always 0 terminated string
static inline void strncpyt(char *dst, const char *src, size_t n)
{
if (dst == NULL || src == NULL)
return;
if (n > 1) {
strncpy(dst, src, n - 1);
dst[n - 1] = 0;

View file

@ -24,14 +24,11 @@ DMOBJ *DEAMON_DM_ROOT_OBJ = NULL;
DM_MAP_VENDOR *DEAMON_DM_VENDOR_EXTENSION[2] = {0};
DM_MAP_VENDOR_EXCLUDE *DEAMON_DM_VENDOR_EXTENSION_EXCLUDE = NULL;
// uloop.h does not have versions, below line is to use
// deprecated uloop_timeout_remaining for the time being
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
static struct {
int trans_id;
struct uloop_timeout trans_timeout;
int timeout_ms;
char app[32];
} g_current_trans = {.trans_id=0, .timeout_ms=10000};
static jmp_buf gs_jump_location;
@ -274,13 +271,13 @@ static int compare_path(const void *arg1, const void *arg2)
}
// Returns transaction id if successful, otherwise 0
int transaction_start(uint32_t max_timeout)
int transaction_start(char *app, uint32_t max_timeout)
{
int ret = 0;
uint32_t timeout;
if (g_current_trans.trans_id) {
WARNING("Transaction already in-process");
WARNING("%s Transaction locked by %s", app, g_current_trans.app);
return 0;
}
@ -289,23 +286,27 @@ int transaction_start(uint32_t max_timeout)
} else {
timeout = g_current_trans.timeout_ms;
}
ret = get_random_id();
strncpyt(g_current_trans.app, app, 32);
g_current_trans.trans_id = ret;
g_current_trans.trans_timeout.cb = transaction_timeout_handler;
uloop_timeout_set(&g_current_trans.trans_timeout, timeout);
INFO("Transaction started with id %d, timeout %zd", g_current_trans.trans_id, timeout);
INFO("Transaction created by [%s] id %d, timeout %zd", g_current_trans.app, g_current_trans.trans_id, timeout);
return ret;
}
int transaction_status(struct blob_buf *bb, int trans_id)
int transaction_status(struct blob_buf *bb)
{
if (g_current_trans.trans_id == trans_id) {
int rem = uloop_timeout_remaining(&g_current_trans.trans_timeout);
blobmsg_add_string(bb, "status", "on-going");
blobmsg_add_u32(bb, "remaining_time", rem / 1000);
if (g_current_trans.trans_id) {
int64_t rem = uloop_timeout_remaining64(&g_current_trans.trans_timeout);
blobmsg_add_string(bb, "app", g_current_trans.app);
blobmsg_add_string(bb, "tstatus", "running");
blobmsg_add_u64(bb, "remaining_time", rem / 1000);
} else {
blobmsg_add_string(bb, "status", "not-exists");
blobmsg_add_string(bb, "tstatus", "Idle");
}
return 0;
@ -329,9 +330,10 @@ int transaction_commit(int trans_id, struct blob_buf *bb, bool is_service_restar
int ret = -1;
if (is_transaction_valid(trans_id)) {
INFO("Commit on-going transaction");
INFO("Commit on-going transaction by %s", g_current_trans.app);
uloop_timeout_cancel(&g_current_trans.trans_timeout);
g_current_trans.trans_id = 0;
g_current_trans.app[0] = '\0';
bbf_entry_restart_services(bb, is_service_restart);
@ -348,9 +350,10 @@ int transaction_abort(int trans_id, struct blob_buf *bb)
int ret = -1;
if (is_transaction_valid(trans_id)) {
INFO("Abort on-going transaction");
INFO("Abort on-going transaction by %s", g_current_trans.app);
uloop_timeout_cancel(&g_current_trans.trans_timeout);
g_current_trans.trans_id = 0;
g_current_trans.app[0] = '\0';
bbf_entry_revert_changes(bb);

View file

@ -41,10 +41,10 @@ void fill_err_code_array(bbfdm_data_t *data, int fault);
void bb_add_string(struct blob_buf *bb, const char *name, const char *value);
int transaction_start(uint32_t max_timeout);
int transaction_start(char *app, uint32_t max_timeout);
int transaction_commit(int trans_id, struct blob_buf *bb, bool is_service_restart);
int transaction_abort(int trans_id, struct blob_buf *bb);
int transaction_status(struct blob_buf *bb, int trans_id);
int transaction_status(struct blob_buf *bb);
bool is_transaction_running(void);
bool is_transaction_valid(int trans_id);
int configure_transaction_timeout(int timeout);