MT#65392 add "fast" flag for delete processing

Change-Id: I16d4cdd9ecc8dbe612eac2ff002283b606f0f082
pull/2127/head
Richard Fuchs 7 days ago
parent 300b4be4dd
commit 6391c6bf95

@ -6450,8 +6450,10 @@ static void monologue_stop(struct call_monologue *ml, bool stop_media_subscriber
// call must be locked in W and will be unlocked upon returning
__attribute__((nonnull(1)))
static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx, int64_t delete_delay) {
if (ctx)
static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx, int64_t delete_delay,
bool stats)
{
if (ctx && stats)
ng_call_stats(ctx, c, NULL, NULL, NULL);
for (__auto_type i = c->monologues.head; i; i = i->next) {
@ -6484,7 +6486,8 @@ static int call_delete_full(call_t *c, const str *callid, ng_command_ctx_t *ctx,
__attribute__((nonnull(1, 2)))
static int call_delete_monologue(call_t *c, const str *callid, struct call_monologue *ml,
const str *fromtag, const str *totag,
ng_command_ctx_t *ctx, int64_t delete_delay)
ng_command_ctx_t *ctx, int64_t delete_delay,
bool stats)
{
c->destroyed = rtpe_now;
@ -6503,9 +6506,9 @@ static int call_delete_monologue(call_t *c, const str *callid, struct call_monol
del_stop = call_monologues_associations_left(c);
if (!del_stop)
return call_delete_full(c, callid, ctx, delete_delay);
return call_delete_full(c, callid, ctx, delete_delay, stats);
if (ctx)
if (ctx && stats)
ng_call_stats(ctx, c, fromtag, totag, NULL);
rwlock_unlock_w(&c->master_lock);
@ -6520,7 +6523,8 @@ static int call_delete_monologue(call_t *c, const str *callid, struct call_monol
// call must be locked in W.
// unlocks the call and releases the reference prior to returning, even on error.
int call_delete_branch(call_t *c, const str *callid, const str *branch,
const str *fromtag, const str *totag, ng_command_ctx_t *ctx, int64_t delete_delay)
const str *fromtag, const str *totag, ng_command_ctx_t *ctx, int64_t delete_delay,
bool stats)
{
struct call_monologue *ml;
const str *match_tag;
@ -6537,26 +6541,26 @@ int call_delete_branch(call_t *c, const str *callid, const str *branch,
}
if (!fromtag || !fromtag->len)
return call_delete_full(c, callid, ctx, delete_delay);
return call_delete_full(c, callid, ctx, delete_delay, stats);
if ((!totag || !totag->len) && branch && branch->len) {
// try a via-branch match
ml = t_hash_table_lookup(c->viabranches, branch);
if (ml)
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay);
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats);
}
match_tag = (totag && totag->len) ? totag : fromtag;
ml = call_get_monologue(c, match_tag);
if (ml)
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay);
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats);
if (branch && branch->len) {
// also try a via-branch match here
ml = t_hash_table_lookup(c->viabranches, branch);
if (ml)
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay);
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats);
}
/* IMPORTANT!
@ -6574,7 +6578,7 @@ int call_delete_branch(call_t *c, const str *callid, const str *branch,
if (ml) {
struct call_monologue *sub_ml = ml_medias_subscribed_to_single_ml(ml);
if (sub_ml && !sub_ml->tag.len)
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay);
return call_delete_monologue(c, callid, ml, fromtag, totag, ctx, delete_delay, stats);
}
}
@ -6596,7 +6600,7 @@ int call_delete_branch_by_id(const str *callid, const str *branch,
ilog(LOG_INFO, "Call-ID to delete not found");
return -1;
}
return call_delete_branch(c, callid, branch, fromtag, totag, ctx, delete_delay);
return call_delete_branch(c, callid, branch, fromtag, totag, ctx, delete_delay, false);
}
struct call_media *call_make_transform_media(struct call_monologue *ml, const str *type, enum media_type type_id,

@ -750,6 +750,9 @@ const char *call_ng_flags_flags(str *s, unsigned int idx, helper_arg arg) {
case CSH_LOOKUP("fatal"):
out->fatal = true;
break;
case CSH_LOOKUP("fast"):
out->fast = true;
break;
case CSH_LOOKUP("fragment"):
out->fragment = true;
break;

@ -754,7 +754,8 @@ const char *call_delete_ng(ng_command_ctx_t *ctx) {
if (call_delete_branch(c, &rtpp_flags.call_id, &rtpp_flags.via_branch,
&rtpp_flags.from_tag,
(rtpp_flags.to_tag_flag ? &rtpp_flags.to_tag : NULL),
ctx, rtpp_flags.delete_delay))
ctx, rtpp_flags.delete_delay,
!rtpp_flags.fast))
{
goto err;
}

@ -1851,6 +1851,12 @@ of zero or more strings. The following flags are defined:
result in an error reply (i.e. `"result": "error"`). The default is to reply with a warning only
(i.e. `"result": "ok", "warning": ...`).
* `fast`
Omit adding statistics to the response message. This makes processing of
the delete message more light-weight and produces a smaller response
message, which is beneficial if the statistics aren't needed.
* `to-tag`
This flag controls whether the `"To"` tag's value is honoured or ignored when handling

@ -943,9 +943,11 @@ void monologue_destroy(struct call_monologue *ml);
__attribute__((nonnull(1)))
int call_delete_branch_by_id(const str *callid, const str *branch,
const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay);
__attribute__((nonnull(1, 2)))
int call_delete_branch(call_t *, const str *callid, const str *branch,
const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay);
const str *fromtag, const str *totag, ng_command_ctx_t *, int64_t delete_delay,
bool stats);
void call_destroy(call_t *);
struct call_media *call_media_new(call_t *call);

@ -313,6 +313,7 @@ RTPE_NG_FLAGS_STR_CASE_HT_PARAMS
bidirectional:1,
unsubscribe:1,
fatal:1,
fast:1,
new_branch:1,
provisional:1,
/* to_tag is used especially by delete handling */

@ -60,6 +60,8 @@ my @flags = qw(
mix
unsubscribe
strip-extmap
fatal
fast
);
my @string_opts = qw(

Loading…
Cancel
Save