| 144 | } |
| 145 | |
| 146 | void status_vfmt(enum log_level level, |
| 147 | const struct node_id *peer, |
| 148 | const char *fmt, va_list ap) |
| 149 | { |
| 150 | char *str; |
| 151 | |
| 152 | /* We only suppress async debug msgs. IO messages are even spammier |
| 153 | * but they only occur when explicitly asked for */ |
| 154 | if (level == LOG_DBG && status_conn) { |
| 155 | size_t qlen = daemon_conn_queue_length(status_conn); |
| 156 | |
| 157 | /* Once suppressing, we keep suppressing until we're empty */ |
| 158 | if (traces_suppressed && qlen == 0) { |
| 159 | size_t n = traces_suppressed; |
| 160 | traces_suppressed = 0; |
| 161 | /* Careful: recursion! */ |
| 162 | status_debug("...[%zu debug messages suppressed]...", n); |
| 163 | } else if (traces_suppressed || qlen > TRACE_QUEUE_LIMIT) { |
| 164 | traces_suppressed++; |
| 165 | return; |
| 166 | } |
| 167 | } |
| 168 | str = tal_vfmt(NULL, fmt, ap); |
| 169 | status_send(take(towire_status_log(NULL, level, peer, str))); |
| 170 | tal_free(str); |
| 171 | } |
| 172 | |
| 173 | void status_fmt(enum log_level level, |
| 174 | const struct node_id *peer, |
no test coverage detected