ngx_int_t update_subscriber_last_msg_id(subscriber_t *sub, nchan_msg_t *msg) { if(msg) { char *err, *huh; if(verify_msg_id(&sub->last_msgid, &msg->prev_id, &msg->id, &err) == NGX_ERROR) { struct timeval tv; time_t time; int ttl = msg->expires - msg->id.time; ngx_gettimeofday(&tv); time = tv.tv_sec; if(sub->last_msgid.time + ttl <= time) { huh = "The message probably expired."; } else { huh = "Try increasing the message buffer length."; } if(sub->type == INTERNAL) { nchan_log_warning("Missed message for internal %V subscriber: %s. %s", sub->name, err, huh); } else { nchan_log_request_warning(sub->request, "Missed message for %V subscriber: %s. %s", sub->name, err, huh); } } nchan_update_multi_msgid(&sub->last_msgid, &msg->id, NULL); } return NGX_OK; }
ngx_int_t update_subscriber_last_msg_id(subscriber_t *sub, nchan_msg_t *msg) { if(msg) { if(verify_msg_id(&sub->last_msgid, &msg->prev_id, &msg->id) == NGX_ERROR) { struct timeval tv; time_t time; int ttl = msg->expires - msg->id.time; ngx_gettimeofday(&tv); time = tv.tv_sec; if(sub->last_msgid.time + ttl <= time) { ERR("missed a message because it probably expired"); } else { ERR("missed a message for an unknown reason. Maybe it's a bug or maybe the message queue length is too small."); } } nchan_update_multi_msgid(&sub->last_msgid, &msg->id, NULL); } return NGX_OK; }
ngx_int_t update_subscriber_last_msg_id(subscriber_t *sub, nchan_msg_t *msg) { if(msg) { if(verify_msg_id(&sub->last_msgid, &msg->prev_id, &msg->id) == NGX_ERROR) { struct timeval tv; time_t time; int ttl = msg->expires - msg->id.time; ngx_gettimeofday(&tv); time = tv.tv_sec; if(sub->last_msgid.time + ttl <= time) { ERR("missed a message because it probably expired"); } else { ERR("missed a message for an unknown reason. That's bad! Stop everything!"); assert(0); } } nchan_update_multi_msgid(&sub->last_msgid, &msg->id); } return NGX_OK; }
static ngx_int_t spool_nextmsg(subscriber_pool_t *spool, nchan_msg_id_t *new_last_id) { subscriber_pool_t *newspool; channel_spooler_t *spl = spool->spooler; ngx_int_t immortal_spool = spool->id.time == NCHAN_NEWEST_MSGID_TIME; int16_t largetags[NCHAN_MULTITAG_MAX]; nchan_msg_id_t new_id = NCHAN_ZERO_MSGID; nchan_copy_msg_id(&new_id, &spool->id, largetags); nchan_update_multi_msgid(&new_id, new_last_id, largetags); //ERR("spool %p nextmsg (%V) --", spool, msgid_to_str(&spool->id)); //ERR(" -- update with (%V) --", msgid_to_str(new_last_id)); //ERR(" -- newid %V", msgid_to_str(&new_id)); if(msg_ids_equal(&spool->id, &new_id)) { ERR("nextmsg id same as curmsg (%V)", msgid_to_str(&spool->id)); assert(0); } else { newspool = !immortal_spool ? find_spool(spl, &new_id) : get_spool(spl, &new_id); if(newspool != NULL) { assert(spool != newspool); spool_transfer_subscribers(spool, newspool, 0); if(!immortal_spool) destroy_spool(spool); } else { ngx_rbtree_node_t *node; assert(!immortal_spool); node = rbtree_node_from_data(spool); rbtree_remove_node(&spl->spoolseed, node); nchan_copy_msg_id(&spool->id, &new_id, NULL); rbtree_insert_node(&spl->spoolseed, node); spool->msg_status = MSG_INVALID; spool->msg = NULL; newspool = spool; /* newspool = get_spool(spl, &new_id); assert(spool != newspool); spool_transfer_subscribers(spool, newspool, 0); destroy_spool(spool); */ } if(newspool->non_internal_sub_count > 0 && spl->handlers->bulk_post_subscribe != NULL) { spl->handlers->bulk_post_subscribe(spl, newspool->non_internal_sub_count, spl->handlers_privdata); } if(newspool->sub_count > 0) { switch(newspool->msg_status) { case MSG_CHANNEL_NOTREADY: newspool->msg_status = MSG_INVALID; case MSG_INVALID: spool_fetch_msg(newspool); break; case MSG_EXPECTED: spool_respond_general(newspool, NULL, NGX_HTTP_NO_CONTENT, NULL, 0); break; default: break; } } } return NGX_OK; }