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) { if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction // 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) { if (trans_id == 0) {
WARNING("Failed to get the lock for the transaction"); WARNING("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); 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) { if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction // 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) { if (trans_id == 0) {
ERR("Failed to get the lock for the transaction"); ERR("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); 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) { if (data.trans_id == 0) {
// Transaction-id is not defined so create an internal transaction // 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) { if (trans_id == 0) {
WARNING("Failed to get the lock for the transaction"); WARNING("Failed to get the lock for the transaction");
fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); 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]); is_service_restart = blobmsg_get_bool(tb[TRANS_RESTART]);
fill_optional_data(&data, tb[TRANS_OPTIONAL]); 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); bbf_init(&data.bbf_ctx);
blob_buf_init(&data.bb, 0); blob_buf_init(&data.bb, 0);
if (is_str_eq(trans_cmd, "start")) { if (is_str_eq(trans_cmd, "start")) {
ret = transaction_start(max_timeout); ret = transaction_start("API", max_timeout);
if (ret) { if (ret) {
blobmsg_add_u8(&data.bb, "status", true); blobmsg_add_u8(&data.bb, "status", true);
blobmsg_add_u32(&data.bb, "transaction_id", ret); blobmsg_add_u32(&data.bb, "transaction_id", ret);
} else { } else {
blobmsg_add_u8(&data.bb, "status", false); blobmsg_add_u8(&data.bb, "status", false);
transaction_status(&data.bb);
} }
} else if (is_str_eq(trans_cmd, "commit")) { } else if (is_str_eq(trans_cmd, "commit")) {
ret = transaction_commit(data.trans_id, &data.bb, is_service_restart); 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); ret = transaction_abort(data.trans_id, &data.bb);
blobmsg_add_u8(&data.bb, "status", (ret == 0)); blobmsg_add_u8(&data.bb, "status", (ret == 0));
} else if (is_str_eq(trans_cmd, "status")) { } else if (is_str_eq(trans_cmd, "status")) {
transaction_status(&data.bb, data.trans_id); transaction_status(&data.bb);
} else { } else {
WARNING("method(%s) not supported", method); 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 // strncpy with always 0 terminated string
static inline void strncpyt(char *dst, const char *src, size_t n) static inline void strncpyt(char *dst, const char *src, size_t n)
{ {
if (dst == NULL || src == NULL)
return;
if (n > 1) { if (n > 1) {
strncpy(dst, src, n - 1); strncpy(dst, src, n - 1);
dst[n - 1] = 0; 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 *DEAMON_DM_VENDOR_EXTENSION[2] = {0};
DM_MAP_VENDOR_EXCLUDE *DEAMON_DM_VENDOR_EXTENSION_EXCLUDE = NULL; 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 { static struct {
int trans_id; int trans_id;
struct uloop_timeout trans_timeout; struct uloop_timeout trans_timeout;
int timeout_ms; int timeout_ms;
char app[32];
} g_current_trans = {.trans_id=0, .timeout_ms=10000}; } g_current_trans = {.trans_id=0, .timeout_ms=10000};
static jmp_buf gs_jump_location; 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 // 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; int ret = 0;
uint32_t timeout; uint32_t timeout;
if (g_current_trans.trans_id) { if (g_current_trans.trans_id) {
WARNING("Transaction already in-process"); WARNING("%s Transaction locked by %s", app, g_current_trans.app);
return 0; return 0;
} }
@ -289,23 +286,27 @@ int transaction_start(uint32_t max_timeout)
} else { } else {
timeout = g_current_trans.timeout_ms; timeout = g_current_trans.timeout_ms;
} }
ret = get_random_id(); ret = get_random_id();
strncpyt(g_current_trans.app, app, 32);
g_current_trans.trans_id = ret; g_current_trans.trans_id = ret;
g_current_trans.trans_timeout.cb = transaction_timeout_handler; g_current_trans.trans_timeout.cb = transaction_timeout_handler;
uloop_timeout_set(&g_current_trans.trans_timeout, timeout); 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; 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) { if (g_current_trans.trans_id) {
int rem = uloop_timeout_remaining(&g_current_trans.trans_timeout); int64_t rem = uloop_timeout_remaining64(&g_current_trans.trans_timeout);
blobmsg_add_string(bb, "status", "on-going"); blobmsg_add_string(bb, "app", g_current_trans.app);
blobmsg_add_u32(bb, "remaining_time", rem / 1000); blobmsg_add_string(bb, "tstatus", "running");
blobmsg_add_u64(bb, "remaining_time", rem / 1000);
} else { } else {
blobmsg_add_string(bb, "status", "not-exists"); blobmsg_add_string(bb, "tstatus", "Idle");
} }
return 0; return 0;
@ -329,9 +330,10 @@ int transaction_commit(int trans_id, struct blob_buf *bb, bool is_service_restar
int ret = -1; int ret = -1;
if (is_transaction_valid(trans_id)) { 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); uloop_timeout_cancel(&g_current_trans.trans_timeout);
g_current_trans.trans_id = 0; g_current_trans.trans_id = 0;
g_current_trans.app[0] = '\0';
bbf_entry_restart_services(bb, is_service_restart); 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; int ret = -1;
if (is_transaction_valid(trans_id)) { 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); uloop_timeout_cancel(&g_current_trans.trans_timeout);
g_current_trans.trans_id = 0; g_current_trans.trans_id = 0;
g_current_trans.app[0] = '\0';
bbf_entry_revert_changes(bb); 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); 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_commit(int trans_id, struct blob_buf *bb, bool is_service_restart);
int transaction_abort(int trans_id, struct blob_buf *bb); 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_running(void);
bool is_transaction_valid(int trans_id); bool is_transaction_valid(int trans_id);
int configure_transaction_timeout(int timeout); int configure_transaction_timeout(int timeout);