<p><b>@jia200x</b> commented on this pull request.</p>

<hr>

<p>In <a href="https://github.com/RIOT-OS/RIOT/pull/10622#discussion_r244730367">doc/memos/rdm-draft-alamos-lanzieri-runtime-configuration-architecture.md</a>:</p>
<pre style='color:#555'>> +and the following acronyms:
+
+- RDM: RIOT Developer Memo
+- CTF: RIOT's Configuration Task Force
+- RCS: Runtime Configuration System
+
+# 1. Introduction
+This document specifies the proposed architecture by the
+Configuration Task Force (CFT) to implement a secure and reliable Runtime
+Configuration System (RCS), focusing in modularity, reusing of existing
+technologies in RIOT (network stack, storage interface) and adhering to
+standards.
+
+# 2. Architecture
+The RCS is formed by [the RIOT Registry](3-the-riot-registry), one or more [Registry Handlers](4-registry-handlers), one or more
+[storage facilities](5-storage-facilities) and a [configuration manager](6-configuration-manager) with one or more interfaces. The
</pre>
<blockquote>
<p>Could you add a bit more explanation here? Commonly, an architecture consists of components, their semantics, their interfaces, and their interactions. I would love to see an exhaustive high-level description here. In particular, I haven't really caught:</p>
</blockquote>
<p>Sure, we will.</p>
<p>I will try to answer here anyway and rephrase this section on the fly.</p>
<blockquote>
<p>Is the registry just a facade or does it provide intrinsic functionality?</p>
</blockquote>
<p>The registry provides intrinsic functionality:</p>
<ul>
<li>Register and keep a list of <em>registry handlers</em></li>
<li>Orchestrate config operations via these <em>registry handlers</em> (get, set, commit, export)</li>
</ul>
<blockquote>
<p>Is the Registry an order-preserving key-value store of contextually grouped keys?</p>
</blockquote>
<p>I would say the Registry is an <em>orchestrator</em> to configure RIOT modules at runtime (via <em>registry handlers</em>) and persist these configurations in any data structures like file systems (via <em>storage</em>).</p>
<p>The combination of the Registry + Registry Handlers + Storage Facilities provide a key-value store of contextually grouped keys (ordered or non-ordered) at code level. Then, a Configuration Manager is required e.g to configure a TX interval via CoAP.</p>
<blockquote>
<p>What is the API of the Registry in relation to the APIs of the Registry Handlers?</p>
</blockquote>
<p>The API of the Registry provides high level functions to handle persistent configurations. The API of the Registry Handlers provides low level functions that are intended to be orchestrated by the Registry.</p>
<p>In RIOT slang, the Registry is to <code>netapi</code> as the Registry Handlers are to <code>netdev</code>.</p>
<blockquote>
<p>Is the configuration manager actively handling system configurations? Or is it just a skeleton for orchestrating the access to the configuration system?</p>
</blockquote>
<p>As described before, it's closer to a skeleton for orchestrating the access to the configuration system.</p>
<blockquote>
<p>What does a Registry Handler do beyond providing a contextual name?</p>
</blockquote>
<p>A Registry Handler also provides 4 functions required to do all configuration operations, as described in <a href="https://github.com/RIOT-OS/RIOT/pull/10622/files#diff-63356eb67626b5872bf0edb05a1a0befR77">4. Registry Handlers</a>. <a href="https://gist.github.com/jia200x/cca922092ca0d13957dee203e9ad9b55">Here's a conceptual example of how a registry handler would look</a></p>
<blockquote>
<p>How do all these components interact when retrieving or changing a configuration parameter?</p>
</blockquote>
<p>E.g for retrieving the value of "a_config" (uint16_t) from a module "module" in a "buf" variable, a user would do:</p>
<pre><code>registry_get_value("module/a_config", buf, sizeof(uint16_t));
</code></pre>
<p>This:</p>
<ol>
<li>Searches for a Registry Handler with "module" name in the global list of registry handlers.</li>
<li>If found, calls the registry handler's <code>get</code> function with "a_config" key.</li>
<li>The <code>get</code> function copies the value to the <code>buf</code> variable</li>
</ol>
<p>E.g for changing a configuration parameter:</p>
<pre><code>/* Set "a_config" to the value in buf */
registry_set_value("module/a_config", buf);
</code></pre>
<p>This:</p>
<ol>
<li>Searches for a Registry Handler with "module" name in the global list of registry handlers.</li>
<li>If found, calls the registry handler's <code>set</code> function with "a_config" key.</li>
<li>The <code>set</code> function copies the value in the <code>buf</code> variable to the corresponding variable.</li>
</ol>
<p>At any time it's possible to either load or save all configuration parameters from the non-volatile storage device with dedicated load and save functions.<br>
E.g:</p>
<pre><code>/* At this point all configuration have their default values */

registry_load();

/* Now, all configurations got their values from the non-volatile storage */

registry_set_value("module/a_config", buf, sizeof(uint16_t));

/* At this point "a_config" has a different value BUT STILL NOT REFLECTED IN THE STORAGE

registry_save();

/* Now, the new configuration is stored permanently */
</code></pre>
<p>As one could imagine, <code>registry_load</code> will read all configurations from the storage and call all registry handler <code>set</code> functions . And of course, <code>registry_save</code> will call all registry handler <code>get</code> functions and save them in the storage.</p>
<p>Hope everything is more clear now. I will reflect these answers in the RDM. Please don't hesitate to ask again if needed.</p>

<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">—<br />You are receiving this because you are subscribed to this thread.<br />Reply to this email directly, <a href="https://github.com/RIOT-OS/RIOT/pull/10622#discussion_r244730367">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AEn7YLT5tTodjHcKg4JAhSF0UNeGF1AQks5u_K3ngaJpZM4ZWxkJ">mute the thread</a>.<img src="https://github.com/notifications/beacon/AEn7YDcviumps5qaziP_WqrzxkLNq50Yks5u_K3ngaJpZM4ZWxkJ.gif" height="1" width="1" alt="" /></p>
<script type="application/json" data-scope="inboxmarkup">{"api_version":"1.0","publisher":{"api_key":"05dde50f1d1a384dd78767c55493e4bb","name":"GitHub"},"entity":{"external_key":"github/RIOT-OS/RIOT","title":"RIOT-OS/RIOT","subtitle":"GitHub repository","main_image_url":"https://github.githubassets.com/images/email/message_cards/header.png","avatar_image_url":"https://github.githubassets.com/images/email/message_cards/avatar.png","action":{"name":"Open in GitHub","url":"https://github.com/RIOT-OS/RIOT"}},"updates":{"snippets":[{"icon":"PERSON","message":"@jia200x commented on #10622"}],"action":{"name":"View Pull Request","url":"https://github.com/RIOT-OS/RIOT/pull/10622#discussion_r244730367"}}}</script>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/RIOT-OS/RIOT/pull/10622#discussion_r244730367",
"url": "https://github.com/RIOT-OS/RIOT/pull/10622#discussion_r244730367",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>