diff options
Diffstat (limited to 'src/namestore/gnunet-service-namestore.c')
-rw-r--r-- | src/namestore/gnunet-service-namestore.c | 201 |
1 files changed, 132 insertions, 69 deletions
diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 6d3cc45ec..1f621c5f0 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c | |||
@@ -132,6 +132,11 @@ struct NamestoreClient | |||
132 | struct GNUNET_SERVICE_Client *client; | 132 | struct GNUNET_SERVICE_Client *client; |
133 | 133 | ||
134 | /** | 134 | /** |
135 | * Database handle | ||
136 | */ | ||
137 | struct GNUNET_NAMESTORE_PluginFunctions *GSN_database; | ||
138 | |||
139 | /** | ||
135 | * Message queue for transmission to @e client | 140 | * Message queue for transmission to @e client |
136 | */ | 141 | */ |
137 | struct GNUNET_MQ_Handle *mq; | 142 | struct GNUNET_MQ_Handle *mq; |
@@ -353,11 +358,6 @@ static struct GNUNET_STATISTICS_Handle *statistics; | |||
353 | static struct GNUNET_NAMECACHE_Handle *namecache; | 358 | static struct GNUNET_NAMECACHE_Handle *namecache; |
354 | 359 | ||
355 | /** | 360 | /** |
356 | * Database handle | ||
357 | */ | ||
358 | static struct GNUNET_NAMESTORE_PluginFunctions *GSN_database; | ||
359 | |||
360 | /** | ||
361 | * Name of the database plugin | 361 | * Name of the database plugin |
362 | */ | 362 | */ |
363 | static char *db_lib_name; | 363 | static char *db_lib_name; |
@@ -436,7 +436,6 @@ cleanup_task (void *cls) | |||
436 | GNUNET_NAMECACHE_disconnect (namecache); | 436 | GNUNET_NAMECACHE_disconnect (namecache); |
437 | namecache = NULL; | 437 | namecache = NULL; |
438 | } | 438 | } |
439 | GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, GSN_database)); | ||
440 | GNUNET_free (db_lib_name); | 439 | GNUNET_free (db_lib_name); |
441 | db_lib_name = NULL; | 440 | db_lib_name = NULL; |
442 | if (NULL != monitor_nc) | 441 | if (NULL != monitor_nc) |
@@ -560,11 +559,13 @@ cache_nick (const struct GNUNET_IDENTITY_PrivateKey *zone, | |||
560 | /** | 559 | /** |
561 | * Return the NICK record for the zone (if it exists). | 560 | * Return the NICK record for the zone (if it exists). |
562 | * | 561 | * |
562 | * @param nc the namestore client | ||
563 | * @param zone private key for the zone to look for nick | 563 | * @param zone private key for the zone to look for nick |
564 | * @return NULL if no NICK record was found | 564 | * @return NULL if no NICK record was found |
565 | */ | 565 | */ |
566 | static struct GNUNET_GNSRECORD_Data * | 566 | static struct GNUNET_GNSRECORD_Data * |
567 | get_nick_record (const struct GNUNET_IDENTITY_PrivateKey *zone) | 567 | get_nick_record (const struct NamestoreClient *nc, |
568 | const struct GNUNET_IDENTITY_PrivateKey *zone) | ||
568 | { | 569 | { |
569 | struct GNUNET_IDENTITY_PublicKey pub; | 570 | struct GNUNET_IDENTITY_PublicKey pub; |
570 | struct GNUNET_GNSRECORD_Data *nick; | 571 | struct GNUNET_GNSRECORD_Data *nick; |
@@ -588,11 +589,11 @@ get_nick_record (const struct GNUNET_IDENTITY_PrivateKey *zone) | |||
588 | } | 589 | } |
589 | 590 | ||
590 | nick = NULL; | 591 | nick = NULL; |
591 | res = GSN_database->lookup_records (GSN_database->cls, | 592 | res = nc->GSN_database->lookup_records (nc->GSN_database->cls, |
592 | zone, | 593 | zone, |
593 | GNUNET_GNS_EMPTY_LABEL_AT, | 594 | GNUNET_GNS_EMPTY_LABEL_AT, |
594 | &lookup_nick_it, | 595 | &lookup_nick_it, |
595 | &nick); | 596 | &nick); |
596 | if ((GNUNET_OK != res) || (NULL == nick)) | 597 | if ((GNUNET_OK != res) || (NULL == nick)) |
597 | { | 598 | { |
598 | #if ! defined(GNUNET_CULL_LOGGING) | 599 | #if ! defined(GNUNET_CULL_LOGGING) |
@@ -735,7 +736,7 @@ send_lookup_response (struct NamestoreClient *nc, | |||
735 | char *name_tmp; | 736 | char *name_tmp; |
736 | char *rd_ser; | 737 | char *rd_ser; |
737 | 738 | ||
738 | nick = get_nick_record (zone_key); | 739 | nick = get_nick_record (nc, zone_key); |
739 | GNUNET_assert (-1 != GNUNET_GNSRECORD_records_get_size (rd_count, rd)); | 740 | GNUNET_assert (-1 != GNUNET_GNSRECORD_records_get_size (rd_count, rd)); |
740 | 741 | ||
741 | if ((NULL != nick) && (0 != strcmp (name, GNUNET_GNS_EMPTY_LABEL_AT))) | 742 | if ((NULL != nick) && (0 != strcmp (name, GNUNET_GNS_EMPTY_LABEL_AT))) |
@@ -936,7 +937,7 @@ refresh_block (struct NamestoreClient *nc, | |||
936 | rd_clean[rd_count_clean++] = rd[i]; | 937 | rd_clean[rd_count_clean++] = rd[i]; |
937 | } | 938 | } |
938 | 939 | ||
939 | nick = get_nick_record (zone_key); | 940 | nick = get_nick_record (nc, zone_key); |
940 | res_count = rd_count_clean; | 941 | res_count = rd_count_clean; |
941 | res = (struct GNUNET_GNSRECORD_Data *) rd_clean; /* fixme: a bit unclean... */ | 942 | res = (struct GNUNET_GNSRECORD_Data *) rd_clean; /* fixme: a bit unclean... */ |
942 | if ((NULL != nick) && (0 != strcmp (name, GNUNET_GNS_EMPTY_LABEL_AT))) | 943 | if ((NULL != nick) && (0 != strcmp (name, GNUNET_GNS_EMPTY_LABEL_AT))) |
@@ -1168,6 +1169,7 @@ client_disconnect_cb (void *cls, | |||
1168 | for (cop = cop_head; NULL != cop; cop = cop->next) | 1169 | for (cop = cop_head; NULL != cop; cop = cop->next) |
1169 | if (nc == cop->nc) | 1170 | if (nc == cop->nc) |
1170 | cop->nc = NULL; | 1171 | cop->nc = NULL; |
1172 | GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, nc->GSN_database)); | ||
1171 | GNUNET_free (nc); | 1173 | GNUNET_free (nc); |
1172 | } | 1174 | } |
1173 | 1175 | ||
@@ -1186,12 +1188,35 @@ client_connect_cb (void *cls, | |||
1186 | struct GNUNET_MQ_Handle *mq) | 1188 | struct GNUNET_MQ_Handle *mq) |
1187 | { | 1189 | { |
1188 | struct NamestoreClient *nc; | 1190 | struct NamestoreClient *nc; |
1191 | char *database; | ||
1192 | char *db_lib_name; | ||
1189 | 1193 | ||
1190 | (void) cls; | 1194 | (void) cls; |
1191 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client); | 1195 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client); |
1192 | nc = GNUNET_new (struct NamestoreClient); | 1196 | nc = GNUNET_new (struct NamestoreClient); |
1193 | nc->client = client; | 1197 | nc->client = client; |
1194 | nc->mq = mq; | 1198 | nc->mq = mq; |
1199 | /* Loading database plugin */ | ||
1200 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (GSN_cfg, | ||
1201 | "namestore", | ||
1202 | "database", | ||
1203 | &database)) | ||
1204 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No database backend configured\n"); | ||
1205 | GNUNET_asprintf (&db_lib_name, "libgnunet_plugin_namestore_%s", database); | ||
1206 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Loading %s\n", db_lib_name); | ||
1207 | nc->GSN_database = GNUNET_PLUGIN_load (db_lib_name, (void *) GSN_cfg); | ||
1208 | GNUNET_free (database); | ||
1209 | if (NULL == nc->GSN_database) | ||
1210 | { | ||
1211 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
1212 | "Could not load database backend `%s'\n", | ||
1213 | db_lib_name); | ||
1214 | GNUNET_free (db_lib_name); | ||
1215 | GNUNET_free (nc); | ||
1216 | return NULL; | ||
1217 | } | ||
1218 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Loaded %s\n", db_lib_name); | ||
1219 | GNUNET_free (db_lib_name); | ||
1195 | return nc; | 1220 | return nc; |
1196 | } | 1221 | } |
1197 | 1222 | ||
@@ -1402,12 +1427,12 @@ handle_record_lookup (void *cls, const struct LabelLookupMessage *ll_msg) | |||
1402 | rlc.res_rd_count = 0; | 1427 | rlc.res_rd_count = 0; |
1403 | rlc.res_rd = NULL; | 1428 | rlc.res_rd = NULL; |
1404 | rlc.rd_ser_len = 0; | 1429 | rlc.rd_ser_len = 0; |
1405 | rlc.nick = get_nick_record (&ll_msg->zone); | 1430 | rlc.nick = get_nick_record (nc, &ll_msg->zone); |
1406 | res = GSN_database->lookup_records (GSN_database->cls, | 1431 | res = nc->GSN_database->lookup_records (nc->GSN_database->cls, |
1407 | &ll_msg->zone, | 1432 | &ll_msg->zone, |
1408 | conv_name, | 1433 | conv_name, |
1409 | &lookup_it, | 1434 | &lookup_it, |
1410 | &rlc); | 1435 | &rlc); |
1411 | env = | 1436 | env = |
1412 | GNUNET_MQ_msg_extra (llr_msg, | 1437 | GNUNET_MQ_msg_extra (llr_msg, |
1413 | name_len + rlc.rd_ser_len, | 1438 | name_len + rlc.rd_ser_len, |
@@ -1591,11 +1616,11 @@ handle_record_store (void *cls, const struct RecordStoreMessage *rp_msg) | |||
1591 | "Creating %u records for name `%s'\n", | 1616 | "Creating %u records for name `%s'\n", |
1592 | (unsigned int) rd_count, | 1617 | (unsigned int) rd_count, |
1593 | conv_name); | 1618 | conv_name); |
1594 | if ((GNUNET_NO == GSN_database->lookup_records (GSN_database->cls, | 1619 | if ((GNUNET_NO == nc->GSN_database->lookup_records (nc->GSN_database->cls, |
1595 | &rp_msg->private_key, | 1620 | &rp_msg->private_key, |
1596 | conv_name, | 1621 | conv_name, |
1597 | &get_block_exp_existing, | 1622 | &get_block_exp_existing, |
1598 | &existing_block_exp)) && | 1623 | &existing_block_exp)) && |
1599 | (rd_count == 0)) | 1624 | (rd_count == 0)) |
1600 | { | 1625 | { |
1601 | /* This name does not exist, so cannot be removed */ | 1626 | /* This name does not exist, so cannot be removed */ |
@@ -1676,11 +1701,11 @@ handle_record_store (void *cls, const struct RecordStoreMessage *rp_msg) | |||
1676 | /* remove nick record from cache, in case we have one there */ | 1701 | /* remove nick record from cache, in case we have one there */ |
1677 | cache_nick (&rp_msg->private_key, NULL); | 1702 | cache_nick (&rp_msg->private_key, NULL); |
1678 | } | 1703 | } |
1679 | res = GSN_database->store_records (GSN_database->cls, | 1704 | res = nc->GSN_database->store_records (nc->GSN_database->cls, |
1680 | &rp_msg->private_key, | 1705 | &rp_msg->private_key, |
1681 | conv_name, | 1706 | conv_name, |
1682 | rd_nf_count, | 1707 | rd_nf_count, |
1683 | rd_nf); | 1708 | rd_nf); |
1684 | } | 1709 | } |
1685 | 1710 | ||
1686 | if (GNUNET_OK != res) | 1711 | if (GNUNET_OK != res) |
@@ -1703,6 +1728,57 @@ handle_record_store (void *cls, const struct RecordStoreMessage *rp_msg) | |||
1703 | } | 1728 | } |
1704 | } | 1729 | } |
1705 | 1730 | ||
1731 | /** | ||
1732 | * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_TX_CONTROL message | ||
1733 | * | ||
1734 | * @param cls client sending the message | ||
1735 | * @param tx_msg message of type `struct TxControlMessage` | ||
1736 | */ | ||
1737 | static void | ||
1738 | handle_tx_control (void *cls, const struct TxControlMessage *tx_msg) | ||
1739 | { | ||
1740 | struct NamestoreClient *nc = cls; | ||
1741 | struct TxControlResultMessage *txr_msg; | ||
1742 | struct GNUNET_MQ_Envelope *env; | ||
1743 | enum GNUNET_GenericReturnValue ret; | ||
1744 | char *emsg; | ||
1745 | char *err_tmp; | ||
1746 | size_t err_len; | ||
1747 | |||
1748 | switch (ntohs (tx_msg->control)) | ||
1749 | { | ||
1750 | case GNUNET_NAMESTORE_TX_BEGIN: | ||
1751 | ret = nc->GSN_database->transaction_begin (nc->GSN_database->cls, | ||
1752 | &emsg); | ||
1753 | break; | ||
1754 | case GNUNET_NAMESTORE_TX_COMMIT: | ||
1755 | ret = nc->GSN_database->transaction_commit (nc->GSN_database->cls, | ||
1756 | &emsg); | ||
1757 | break; | ||
1758 | case GNUNET_NAMESTORE_TX_ROLLBACK: | ||
1759 | ret = nc->GSN_database->transaction_rollback (nc->GSN_database->cls, | ||
1760 | &emsg); | ||
1761 | break; | ||
1762 | default: | ||
1763 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
1764 | "Unknown control type %u\n", ntohs (tx_msg->control)); | ||
1765 | GNUNET_break (0); | ||
1766 | } | ||
1767 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1768 | "TX status is %u\n", ret); | ||
1769 | err_len = (GNUNET_YES == ret) ? 0 : strlen (emsg) + 1; | ||
1770 | env = | ||
1771 | GNUNET_MQ_msg_extra (txr_msg, | ||
1772 | err_len, | ||
1773 | GNUNET_MESSAGE_TYPE_NAMESTORE_TX_CONTROL_RESULT); | ||
1774 | txr_msg->gns_header.header.size = htons (sizeof (struct TxControlResultMessage) + err_len); | ||
1775 | txr_msg->gns_header.r_id = tx_msg->gns_header.r_id; | ||
1776 | txr_msg->success = htons (ret); | ||
1777 | err_tmp = (char *) &txr_msg[1]; | ||
1778 | GNUNET_memcpy (err_tmp, emsg, err_len); | ||
1779 | GNUNET_MQ_send (nc->mq, env); | ||
1780 | GNUNET_SERVICE_client_continue (nc->client); | ||
1781 | } | ||
1706 | 1782 | ||
1707 | /** | 1783 | /** |
1708 | * Context for record remove operations passed from #handle_zone_to_name to | 1784 | * Context for record remove operations passed from #handle_zone_to_name to |
@@ -1817,11 +1893,11 @@ handle_zone_to_name (void *cls, const struct ZoneToNameMessage *ztn_msg) | |||
1817 | ztn_ctx.rid = ntohl (ztn_msg->gns_header.r_id); | 1893 | ztn_ctx.rid = ntohl (ztn_msg->gns_header.r_id); |
1818 | ztn_ctx.nc = nc; | 1894 | ztn_ctx.nc = nc; |
1819 | ztn_ctx.success = GNUNET_NO; | 1895 | ztn_ctx.success = GNUNET_NO; |
1820 | if (GNUNET_SYSERR == GSN_database->zone_to_name (GSN_database->cls, | 1896 | if (GNUNET_SYSERR == nc->GSN_database->zone_to_name (nc->GSN_database->cls, |
1821 | &ztn_msg->zone, | 1897 | &ztn_msg->zone, |
1822 | &ztn_msg->value_zone, | 1898 | &ztn_msg->value_zone, |
1823 | &handle_zone_to_name_it, | 1899 | &handle_zone_to_name_it, |
1824 | &ztn_ctx)) | 1900 | &ztn_ctx)) |
1825 | { | 1901 | { |
1826 | /* internal error, hang up instead of signalling something | 1902 | /* internal error, hang up instead of signalling something |
1827 | that might be wrong */ | 1903 | that might be wrong */ |
@@ -1935,6 +2011,7 @@ run_zone_iteration_round (struct ZoneIteration *zi, uint64_t limit) | |||
1935 | struct ZoneIterationProcResult proc; | 2011 | struct ZoneIterationProcResult proc; |
1936 | struct GNUNET_TIME_Absolute start; | 2012 | struct GNUNET_TIME_Absolute start; |
1937 | struct GNUNET_TIME_Relative duration; | 2013 | struct GNUNET_TIME_Relative duration; |
2014 | struct NamestoreClient *nc = zi->nc; | ||
1938 | 2015 | ||
1939 | memset (&proc, 0, sizeof(proc)); | 2016 | memset (&proc, 0, sizeof(proc)); |
1940 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 2017 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -1945,15 +2022,16 @@ run_zone_iteration_round (struct ZoneIteration *zi, uint64_t limit) | |||
1945 | proc.limit = limit; | 2022 | proc.limit = limit; |
1946 | start = GNUNET_TIME_absolute_get (); | 2023 | start = GNUNET_TIME_absolute_get (); |
1947 | GNUNET_break (GNUNET_SYSERR != | 2024 | GNUNET_break (GNUNET_SYSERR != |
1948 | GSN_database->iterate_records (GSN_database->cls, | 2025 | nc->GSN_database->iterate_records (nc->GSN_database->cls, |
1949 | (GNUNET_YES == GNUNET_is_zero ( | 2026 | (GNUNET_YES == |
1950 | &zi->zone)) | 2027 | GNUNET_is_zero ( |
2028 | &zi->zone)) | ||
1951 | ? NULL | 2029 | ? NULL |
1952 | : &zi->zone, | 2030 | : &zi->zone, |
1953 | zi->seq, | 2031 | zi->seq, |
1954 | limit, | 2032 | limit, |
1955 | &zone_iterate_proc, | 2033 | &zone_iterate_proc, |
1956 | &proc)); | 2034 | &proc)); |
1957 | duration = GNUNET_TIME_absolute_get_duration (start); | 2035 | duration = GNUNET_TIME_absolute_get_duration (start); |
1958 | duration = GNUNET_TIME_relative_divide (duration, limit - proc.limit); | 2036 | duration = GNUNET_TIME_relative_divide (duration, limit - proc.limit); |
1959 | GNUNET_STATISTICS_set (statistics, | 2037 | GNUNET_STATISTICS_set (statistics, |
@@ -2212,6 +2290,7 @@ static void | |||
2212 | monitor_iteration_next (void *cls) | 2290 | monitor_iteration_next (void *cls) |
2213 | { | 2291 | { |
2214 | struct ZoneMonitor *zm = cls; | 2292 | struct ZoneMonitor *zm = cls; |
2293 | struct NamestoreClient *nc = zm->nc; | ||
2215 | int ret; | 2294 | int ret; |
2216 | 2295 | ||
2217 | zm->task = NULL; | 2296 | zm->task = NULL; |
@@ -2220,15 +2299,13 @@ monitor_iteration_next (void *cls) | |||
2220 | zm->iteration_cnt = zm->limit / 2; /* leave half for monitor events */ | 2299 | zm->iteration_cnt = zm->limit / 2; /* leave half for monitor events */ |
2221 | else | 2300 | else |
2222 | zm->iteration_cnt = zm->limit; /* use it all */ | 2301 | zm->iteration_cnt = zm->limit; /* use it all */ |
2223 | ret = GSN_database->iterate_records (GSN_database->cls, | 2302 | ret = nc->GSN_database->iterate_records (nc->GSN_database->cls, |
2224 | (GNUNET_YES == GNUNET_is_zero ( | 2303 | (GNUNET_YES == GNUNET_is_zero ( |
2225 | &zm->zone)) | 2304 | &zm->zone)) ? NULL : &zm->zone, |
2226 | ? NULL | 2305 | zm->seq, |
2227 | : &zm->zone, | 2306 | zm->iteration_cnt, |
2228 | zm->seq, | 2307 | &monitor_iterate_cb, |
2229 | zm->iteration_cnt, | 2308 | zm); |
2230 | &monitor_iterate_cb, | ||
2231 | zm); | ||
2232 | if (GNUNET_SYSERR == ret) | 2309 | if (GNUNET_SYSERR == ret) |
2233 | { | 2310 | { |
2234 | GNUNET_SERVICE_client_drop (zm->nc->client); | 2311 | GNUNET_SERVICE_client_drop (zm->nc->client); |
@@ -2330,26 +2407,8 @@ run (void *cls, | |||
2330 | namecache = GNUNET_NAMECACHE_connect (cfg); | 2407 | namecache = GNUNET_NAMECACHE_connect (cfg); |
2331 | GNUNET_assert (NULL != namecache); | 2408 | GNUNET_assert (NULL != namecache); |
2332 | } | 2409 | } |
2333 | /* Loading database plugin */ | ||
2334 | if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, | ||
2335 | "namestore", | ||
2336 | "database", | ||
2337 | &database)) | ||
2338 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No database backend configured\n"); | ||
2339 | |||
2340 | GNUNET_asprintf (&db_lib_name, "libgnunet_plugin_namestore_%s", database); | ||
2341 | GSN_database = GNUNET_PLUGIN_load (db_lib_name, (void *) GSN_cfg); | ||
2342 | GNUNET_free (database); | ||
2343 | statistics = GNUNET_STATISTICS_create ("namestore", cfg); | 2410 | statistics = GNUNET_STATISTICS_create ("namestore", cfg); |
2344 | GNUNET_SCHEDULER_add_shutdown (&cleanup_task, NULL); | 2411 | GNUNET_SCHEDULER_add_shutdown (&cleanup_task, NULL); |
2345 | if (NULL == GSN_database) | ||
2346 | { | ||
2347 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | ||
2348 | "Could not load database backend `%s'\n", | ||
2349 | db_lib_name); | ||
2350 | GNUNET_SCHEDULER_shutdown (); | ||
2351 | return; | ||
2352 | } | ||
2353 | } | 2412 | } |
2354 | 2413 | ||
2355 | 2414 | ||
@@ -2363,6 +2422,10 @@ GNUNET_SERVICE_MAIN ( | |||
2363 | &client_connect_cb, | 2422 | &client_connect_cb, |
2364 | &client_disconnect_cb, | 2423 | &client_disconnect_cb, |
2365 | NULL, | 2424 | NULL, |
2425 | GNUNET_MQ_hd_fixed_size (tx_control, | ||
2426 | GNUNET_MESSAGE_TYPE_NAMESTORE_TX_CONTROL, | ||
2427 | struct TxControlMessage, | ||
2428 | NULL), | ||
2366 | GNUNET_MQ_hd_var_size (record_store, | 2429 | GNUNET_MQ_hd_var_size (record_store, |
2367 | GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE, | 2430 | GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE, |
2368 | struct RecordStoreMessage, | 2431 | struct RecordStoreMessage, |