<div dir="ltr"><div class="gmail_quote"><div>Hi,</div><div dir="ltr"><br></div><div dir="ltr"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_quote"><div dir="ltr"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote></div></div></blockquote>We've done a few changes and we've submitted them via pull requests 35 to 47.<br><br>There are two dependencies between those that are related to Cassandra. Cassandra Host Data Source (CHDS) PR contains everything that the Cassandra update PR has and the stress test PR contains everything that the CHDS PR contains. In both cases, it might be easier to merge the contained PR first and then compare the containing PR with it if you so choose.<br>A bit about each:<br><br><b>Cassandra update</b><br>We've added some wrapper functions for communicating with Cassandra: executeWrite for inserts, updates and deletes as they behave similarly, executeRead for selects. This PR contains other minor changes like coding style that are really hard to separate. We apologize for the hardship the code review might entail. It could be minimized by using a formatter on both codes and then comparing.<br><br><b>Cassandra host data source</b><br>The database schema is radically different than the MySQL and the PostgreSQL schemas. Rather than creating a different table for hosts, reservations, DHCPv4 options and DHCPv6 options respectively, we've denormalized them all into a single table to benefit from Cassandra's non-relational nature. To make up for the lack of relations, on insertion, the reservations and options are matched against hosts on the server and merged into database entries. When retrieving, each database row is split into the corresponding host, reservation and options. There can be an inconsistency in the database due to the order of the changes e.g. if you insert a host with no reservations and no options followed by the same host with one reservation will result in 2 entries versus inserting the host with reservation from the beginning which will result in a single entry. In spite of this, retrieving the host will give you the attached reservation in both cases.<br><br>Unit tests are exactly like the other HDS with minor adjustments There are two possible issues that we've found during unit testing.<br>1. In some unit tests, a few database operations are expected to return the rows in the order they have been inserted. This cannot be the case with Cassandra. Since it doesn't support an ORDER BY type of clause on SELECT statements, results are always ordered by it's internal row UUID or by the CLUSTERING ORDER BY clause on the INSERT statement. So the order is consistent, but it cannot be changed at SELECT. We've modified the generic HDS unittest to sort the results manually if Cassandra HDS passed through there. We know his is unprecedented in Kea and bad design, but we can't think of another solution other than removing the sort check altogether.<br>2. MySQL and PostgreSQL have unique indexes or constraints on the HDS tables which Cassandra doesn't support. They are half-simulated only through the primary key that we've chosen for our single table.<br>So the unique indexes are:<br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_quote"><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote></div></div>hosts: dhcp_identifier - dhcp_identifier_type - dhcp4_subnet_id<br>hosts: dhcp_identifier - dhcp_identifier_type - dhcp6_subnet_id<br>hosts: ipv4_address - dhcp4_subnet_id<br><div class="gmail_quote">ipv6_reservations: address - prefix_len</div></blockquote>And our primary key is a hash of concatenated values of the following columns:<br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_quote"><div>dhcp4_subnet_id - dhcp6_subnet_id - ipv4_address - ipv6_prefix_address - ipv6_prefix_length - option_code - option_space<br></div></div></blockquote><div class="gmail_quote">So this is like one big loose constraint. It happens to pass the unit tests that check for duplicate entries, but they aren't thorough enough. So in one unit test, dhcp_identifier is changed, and constraint #3 is expected to be triggered. This works for us because we've expressly excluded dhcp_identifier and type from our key even though it normally should be part of the row identifier. If constraint #1 was to be checked, you would change ipv4_address and constraint #3 would be satisfied, but constraint #1 wouldn't, so the INSERT would fail. This doesn't happen in our case. One costly solution is to do 4 SELECTs (maybe 3) before every insert to check if the values to be inserted are constrained by existing values in the database. We'd like to hear your thoughts on this.</div><br><b>Cassandra host data source stress test</b><br>Some test that we used for benchmarking included as part of the generic HDS unittest. It does a bunch of inserts followed by select statements, all timed and repeated on a increasingly number of hosts and. DISABLED_ by default.<br><b><br></b><b>clang-format</b><br>Added a Clang format style file and a script to apply it to C++ source files. Very handy if used from inside an IDE since you can apply it to blocks of code (e.g. your contribution).<br><br><b>Changes for uniform compilation</b><br>Added #include <config.h> to all .cc files.<br>Added KEA_CXXFLAGS to Makefiles in order to uniformly compile all libraries.<br><b><br></b><b>docbook-upgrade</b><br>Upgraded Docbook from v4.2 to v5.0<br>Used script <a href="http://docbook.org/xml/5.0/tools/db4-upgrade.xsl" target="_blank">http://docbook.org/xml/5.0/too<wbr>ls/db4-upgrade.xsl</a> as specified in the installation documentation at <a href="http://tdg.docbook.org/tdg/5.0/appa.html" target="_blank">http://tdg.docbook.org/tdg/5.0<wbr>/appa.html</a> with command:<br>find . -type f | grep -F ".xml" | xargs -I{} bash -c "xsltproc -o {} db4-upgrade.xsl {}"<br><br><b>Doxyfile</b><br>Updated Doxyfile from 1.8.6 to 1.8.11<br>This is better generated manually with doxygen -g Doxyfile with doxygen version 1.8.11.<br><br><b>makefile-am</b><br>report-cpp-coverage wasn't working because of a syntax error<br>Added coverage target to .NOTPARALLEL to run unit tests and only then build reports.<br>Fixed cppcheck.<br><br><b>googletest</b><br>Corrected gtest library name. Otherwise it doesn't compile --with-gtest.<br><br><b>initialize-logging-before-read<wbr>ing-conf</b><br>Started logging before reading the "Dhcp4" and "Dhcp6" configuration, but after reading the logfile location of course, to log errors thrown because of any configuration loading issues.<br><br><b>schema-version</b><br>Changed PostgreSQL version variable names to be inline with MySQL and Cassandra's<br><br><b>typos</b><br>The important stuff, right? :)<br>We've run a spell checker and "indentified" some spelling mistakes.<br>If you'll review from the command line, we recommend one of the following commands:<br><i>git diff --color-words</i><br>git diff --color-words | sed -n '/31m/,/m/p'<br>git diff --color-words --unified=0<br><br><b>with-dhcp</b><br>with-dhcp-mysql -> with-mysql<br><div class="gmail_quote"><div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"></blockquote>with-dhcp-pgsql -> with-pgsql<br></div><div><br></div><div>Regards,</div><div>Qualitance</div></div></div></div>-- <br><div class="gmail-m_3521199384748204484gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><table style="font-family:"times new roman";margin:0px;padding:0px;border:0px;color:rgb(51,51,51)"><tbody><tr><td><img src="http://i.imgur.com/9M8IU07.png" style="width: 80px; padding-right: 5px; vertical-align: middle;"></td><td style="font-stretch:normal;font-size:11px;font-family:verdana;border-left:1px solid rgb(204,204,204);padding-left:5px"><strong>Andrei Pavel</strong>  <span style="color:rgb(190,190,190)">|</span>  junior c++ developer  <span style="color:rgb(190,190,190)">|</span>  QUALITANCE™<br><strong>RO:</strong> <a href="tel:+40%20748%20220%20135" value="+40748220135" target="_blank">+40 (748) 220 135</a>  <span style="color:rgb(190,190,190)">|</span>  <strong>office:</strong> <a href="tel:+40%20372%20944%20741" value="+40372944741" target="_blank">+40 (372) 944 741</a><br><a href="https://www.google.ro/maps/place/QUALITANCE/@44.433653,26.079464,17z/data=!4m6!1m3!3m2!1s0x40b1ff173c5bc0b9:0x7226343f810c7ede!2sQUALITANCE!3m1!1s0x40b1ff173c5bc0b9:0x7226343f810c7ede?hl=ro" style="text-decoration:none;color:rgb(51,51,51)" target="_blank">Opera Center bldg. 2, fl. 7-8, 2 Dr. Nicolae D. Staicovici, Bucharest 050556</a><br><a href="mailto:andrei.pavel@qualitance.com" style="text-decoration:none;color:rgb(51,51,51)" target="_blank">andrei.pavel@qualitance.com</a>  <span style="color:rgb(190,190,190)">|</span><wbr>  <a href="https://www.qualitance.com/" style="text-decoration:none;color:rgb(51,51,51)" target="_blank">www.qualitance.com</a></td></tr><tr><td colspan="2"><p style="font-stretch:normal;font-size:11px;font-family:verdana">a <a href="http://www2.deloitte.com/content/dam/Deloitte/global/Documents/About-Deloitte/central-europe/CE_Fast_50_2015.pdf" target="_blank">Deloitte Technology Fast 50</a> company <span style="color:rgb(190,190,190)">|</span> ranked in the <a href="http://www.inc.com/inc5000eu/list/2016/" target="_blank">Inc. 5000 Europe</a> for 2016</p></td></tr></tbody></table><table style="font-family:"times new roman";margin:0px;padding:0px;border:0px;color:rgb(51,51,51)"><tbody><tr><td style="font-stretch:normal;font-size:9px;font-family:verdana;color:rgb(153,153,153)">--<br>The information contained in this email is confidential. It is intended only for the stated addressee and access to it by any other person is unauthorised. If you are not an addressee, you must not disclose, copy, circulate or in another way use or reply to the information contained in this email. Such unauthorised use may be unlawful. If you have received this email in error, please notify the sender immediately and delete all copies from your computer and network.</td></tr></tbody></table></div></div></div></div></div></div></div>
</div>