<html>
 <body>
  <div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
   <table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 solid;">
    <tr>
     <td>
      This is an automatically generated e-mail. To reply, visit:
      <a href="https://reviewboard.asterisk.org/r/3780/">https://reviewboard.asterisk.org/r/3780/</a>
     </td>
    </tr>
   </table>
   <br />










<blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
 <p style="margin-top: 0;">On July 17th, 2014, 4:49 p.m. CDT, <b>Mark Michelson</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  



<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; border-collapse: collapse; margin: 2px padding: 2px;">
 <thead>
  <tr>
   <th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; font-size: 9pt; padding: 4px 8px; text-align: left;">
    <a href="https://reviewboard.asterisk.org/r/3780/diff/1/?file=63304#file63304line428" style="color: black; font-weight: bold; text-decoration: underline;">/res/res_pjsip_publish_asterisk.c</a>
    <span style="font-weight: normal;">

     (Diff revision 1)

    </span>
   </th>
  </tr>
 </thead>



 
 

 <tbody>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>
    <th bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2">428</font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span class="k">static</span> <span class="kt">void</span> <span class="nf">asterisk_publication_expire</span><span class="p">(</span><span class="k">struct</span> <span class="n">ast_sip_publication</span> <span class="o">*</span><span class="n">pub</span><span class="p">)</span></pre></td>
  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>
    <th bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2">429</font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span class="p">{</span></pre></td>
  </tr>

  <tr>
    <th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>
    <th bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2">430</font></th>
    <td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "><span class="p">}</span></pre></td>
  </tr>

 </tbody>

</table>

  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Is there some sort of stasis cache removal you could perform here?</pre>
 </blockquote>



 <p>On July 21st, 2014, 7:14 a.m. CDT, <b>Joshua Colp</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">So the best I could do is:

1. For device state do a full cache dump, run the regex against, and set everything it matches to unknown.
2. For mailbox state do a full cache dump, run the regex against, and set every mailbox to 0/0

I would also need to extend things to store a bit of state information about the publisher we are receiving updates from (specifically the eid).

Thoughts?</pre>
 </blockquote>





 <p>On July 21st, 2014, 9:43 a.m. CDT, <b>Mark Michelson</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">I wasn't thinking of simply marking devstates to unknown and mailboxes to 0/0. I was thinking of actually removing the items from the cache entirely.

Does a single publication convey the state of multiple resources? In other words, is the same publication used to transmit the state of PJSIP/Alice at eid 12345 and PJSIP/bob at eid 67890? If so, then I don't necessarily see how you could actually remove cache items on a publication expiration, since you could presumably still be getting those states published from a separate publisher entirely. However, if a publisher is guaranteed to only publish a single resource or just resources that are local to its eid, then upon publication expiration, you could remove the specific resource from the cache or remove all resources from that particular eid.</pre>
 </blockquote>





 <p>On July 21st, 2014, 9:53 a.m. CDT, <b>Joshua Colp</b> wrote:</p>
 <blockquote style="margin-left: 1em; border-left: 2px solid #d0d0d0; padding-left: 10px;">
  <pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">A single publication currently conveys only a single resource (device or mailbox). A PUBLISH will only be sent for updates from the originating system, it does not act as a relay and thus has one eid. As it is I don't think I can safely manipulate the cache to produce the desired result. I can only change them to some unknown values.

Matt - Thoughts?</pre>
 </blockquote>







</blockquote>
<pre style="margin-left: 1em; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">This is a tricky problem.

Internally, the states of all devices/MWI are already stored according to the system's eid:

struct stasis_cache_entry {
        struct cache_entry_key key;
        /*! Aggregate snapshot of the stasis cache. */
        struct stasis_message *aggregate;
        /*! Local entity snapshot of the stasis event. */
        struct stasis_message *local;
        /*! Remote entity snapshots of the stasis event. */
        AST_VECTOR(, struct stasis_message *) remote;
};

A local update (where eid == this system's eid) is stored in local; remote updates are stored in the remote vector. The aggregate is computed if the thing being stored has an aggregate function (which only device state has).

stasis_cache_dump_by_eid/stasis_cache_dump_all gives you a mechanism to get a particular remote system's updates and/or all updates from all systems (which, as you might imagine, is not the most performant thing to do in the world). We could conceivably use similar mechanisms to remove a particular system's update from the cache, or set all entries from a system to a particular value, etc.

The problem is, I'm not sure we should be doing that unless a remote system explicitly tells us to wipe themselves from our cache.

If a PUBLISH request times out, you may want to keep the device state from that system in the cache. If the system is truly down, endpoints from that system may be falling back to you, and you may want to keep the aggregate state computed from what they were on that system. Likewise, we may simply have run into network lag (or a dropped packet) and the remote system may be "fine" - in which case, purging the state may cause some rather odd behaviour.

This feels like something we solve once we know it is causing a problem.</pre>
<br />




<p>- Matt</p>


<br />
<p>On July 21st, 2014, 7:14 a.m. CDT, Joshua Colp wrote:</p>








<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" style="background-image: url('https://reviewboard.asterisk.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); background-position: left top; background-repeat: repeat-x; border: 1px black solid;">
 <tr>
  <td>

<div>Review request for Asterisk Developers.</div>
<div>By Joshua Colp.</div>


<p style="color: grey;"><i>Updated July 21, 2014, 7:14 a.m.</i></p>









<div style="margin-top: 1.5em;">
 <b style="color: #575012; font-size: 10pt;">Repository: </b>
Asterisk
</div>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
 <table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
 <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">This adds two PJSIP modules which add outbound PUBLISH support and an 'asterisk' event type.

The res_pjsip_outbound_publish module is a common module which provides basic logic for setting up outbound PUBLISH clients, handling authentication requests, handling configuration, and lifetime. Extra modules implement specific event types which are registered with res_pjsip_outbound_publish. Since it takes care of configuration when an outbound PUBLISH is configured extra configuration can be passed to the event type implementation to further configure itself.

The res_pjsip_publish_asterisk module implements inbound and outbound support for an 'asterisk' event type. This event type conveys device and mailbox state between Asterisk instances using a JSON content body. As internal device or mailbox state changes the module sends a PUBLISH message to other configured instances. When a PUBLISH is received the contents are examined and a device or mailbox state change queued up within Asterisk. To restrict what is sent and received filtering is available using regular expressions which can reduce SIP traffic.

A wiki page is available at https://wiki.asterisk.org/wiki/display/~jcolp/Exchanging+Device+and+Mailbox+State+Using+PJSIP which has some configuration details with some examples. This should also be reviewed.</pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
 <tr>
  <td>
   <pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Set up two Asterisk instances, configured both sides to publish to eachother, made calls and manipulated voicemail. Watched PUBLISH messages go between them and state change.</pre>
  </td>
 </tr>
</table>


<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">

 <li>/trunk/res/res_pjsip_pubsub.exports.in <span style="color: grey">(419075)</span></li>

 <li>/trunk/res/res_pjsip_pubsub.c <span style="color: grey">(419075)</span></li>

 <li>/trunk/res/res_pjsip_publish_asterisk.c <span style="color: grey">(PRE-CREATION)</span></li>

 <li>/trunk/res/res_pjsip_outbound_publish.exports.in <span style="color: grey">(PRE-CREATION)</span></li>

 <li>/trunk/res/res_pjsip_outbound_publish.c <span style="color: grey">(PRE-CREATION)</span></li>

 <li>/trunk/include/asterisk/res_pjsip_pubsub.h <span style="color: grey">(419075)</span></li>

 <li>/trunk/include/asterisk/res_pjsip_outbound_publish.h <span style="color: grey">(PRE-CREATION)</span></li>

</ul>

<p><a href="https://reviewboard.asterisk.org/r/3780/diff/" style="margin-left: 3em;">View Diff</a></p>







  </td>
 </tr>
</table>








  </div>
 </body>
</html>