Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30dc4bf67d |
@@ -13,8 +13,8 @@
|
|||||||
// Using CRELAY_ prefix to avoid conflicts with nostr_core_lib VERSION macros
|
// Using CRELAY_ prefix to avoid conflicts with nostr_core_lib VERSION macros
|
||||||
#define CRELAY_VERSION_MAJOR 1
|
#define CRELAY_VERSION_MAJOR 1
|
||||||
#define CRELAY_VERSION_MINOR 1
|
#define CRELAY_VERSION_MINOR 1
|
||||||
#define CRELAY_VERSION_PATCH 4
|
#define CRELAY_VERSION_PATCH 5
|
||||||
#define CRELAY_VERSION "v1.1.4"
|
#define CRELAY_VERSION "v1.1.5"
|
||||||
|
|
||||||
// Relay metadata (authoritative source for NIP-11 information)
|
// Relay metadata (authoritative source for NIP-11 information)
|
||||||
#define RELAY_NAME "C-Relay"
|
#define RELAY_NAME "C-Relay"
|
||||||
|
|||||||
@@ -100,10 +100,17 @@ void add_subscription_to_kind_index(subscription_t* sub) {
|
|||||||
filter = filter->next;
|
filter = filter->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If subscription has no kind filter, add to no-kind-filter list
|
// If subscription has no kind filter, add to no-kind-filter list using wrapper node
|
||||||
if (!has_kind_filter) {
|
if (!has_kind_filter) {
|
||||||
sub->next = g_subscription_manager.no_kind_filter_subs;
|
no_kind_filter_node_t* node = malloc(sizeof(no_kind_filter_node_t));
|
||||||
g_subscription_manager.no_kind_filter_subs = sub;
|
if (!node) {
|
||||||
|
DEBUG_ERROR("add_subscription_to_kind_index: failed to allocate no-kind-filter node");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node->subscription = sub;
|
||||||
|
node->next = g_subscription_manager.no_kind_filter_subs;
|
||||||
|
g_subscription_manager.no_kind_filter_subs = node;
|
||||||
DEBUG_TRACE("KIND_INDEX: Added subscription '%s' to no-kind-filter list", sub->id);
|
DEBUG_TRACE("KIND_INDEX: Added subscription '%s' to no-kind-filter list", sub->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,11 +137,13 @@ void remove_subscription_from_kind_index(subscription_t* sub) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove from no-kind-filter list
|
// Remove from no-kind-filter list if present
|
||||||
subscription_t** current = &g_subscription_manager.no_kind_filter_subs;
|
no_kind_filter_node_t** current = &g_subscription_manager.no_kind_filter_subs;
|
||||||
while (*current) {
|
while (*current) {
|
||||||
if (*current == sub) {
|
if ((*current)->subscription == sub) {
|
||||||
|
no_kind_filter_node_t* to_free = *current;
|
||||||
*current = (*current)->next;
|
*current = (*current)->next;
|
||||||
|
free(to_free);
|
||||||
DEBUG_TRACE("KIND_INDEX: Removed subscription '%s' from no-kind-filter list", sub->id);
|
DEBUG_TRACE("KIND_INDEX: Removed subscription '%s' from no-kind-filter list", sub->id);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -797,12 +806,12 @@ int broadcast_event_to_subscriptions(cJSON* event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add subscriptions with no kind filter (must check against all events)
|
// Add subscriptions with no kind filter (must check against all events)
|
||||||
subscription_t* no_kind_sub = g_subscription_manager.no_kind_filter_subs;
|
no_kind_filter_node_t* no_kind_node = g_subscription_manager.no_kind_filter_subs;
|
||||||
while (no_kind_sub && candidate_count < MAX_TOTAL_SUBSCRIPTIONS) {
|
while (no_kind_node && candidate_count < MAX_TOTAL_SUBSCRIPTIONS) {
|
||||||
if (no_kind_sub->active) {
|
if (no_kind_node->subscription && no_kind_node->subscription->active) {
|
||||||
candidates_to_check[candidate_count++] = no_kind_sub;
|
candidates_to_check[candidate_count++] = no_kind_node->subscription;
|
||||||
}
|
}
|
||||||
no_kind_sub = no_kind_sub->next;
|
no_kind_node = no_kind_node->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_TRACE("BROADCAST: Checking %d candidate subscriptions (kind index optimization)", candidate_count);
|
DEBUG_TRACE("BROADCAST: Checking %d candidate subscriptions (kind index optimization)", candidate_count);
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ typedef struct kind_subscription_node {
|
|||||||
struct kind_subscription_node* next; // Next subscription for this kind
|
struct kind_subscription_node* next; // Next subscription for this kind
|
||||||
} kind_subscription_node_t;
|
} kind_subscription_node_t;
|
||||||
|
|
||||||
|
// No-kind-filter list entry - wrapper to avoid corrupting subscription->next pointer
|
||||||
|
typedef struct no_kind_filter_node {
|
||||||
|
subscription_t* subscription; // Pointer to subscription
|
||||||
|
struct no_kind_filter_node* next; // Next subscription in no-kind list
|
||||||
|
} no_kind_filter_node_t;
|
||||||
|
|
||||||
// Per-IP connection tracking
|
// Per-IP connection tracking
|
||||||
typedef struct ip_connection_info {
|
typedef struct ip_connection_info {
|
||||||
char ip_address[CLIENT_IP_MAX_LENGTH]; // IP address
|
char ip_address[CLIENT_IP_MAX_LENGTH]; // IP address
|
||||||
@@ -87,7 +93,7 @@ struct subscription_manager {
|
|||||||
|
|
||||||
// Kind-based index for fast subscription lookup (10x performance improvement)
|
// Kind-based index for fast subscription lookup (10x performance improvement)
|
||||||
kind_subscription_node_t* kind_index[65536]; // Array of subscription lists, one per kind
|
kind_subscription_node_t* kind_index[65536]; // Array of subscription lists, one per kind
|
||||||
subscription_t* no_kind_filter_subs; // Subscriptions with no kind filter (must check all events)
|
no_kind_filter_node_t* no_kind_filter_subs; // Subscriptions with no kind filter (wrapper nodes)
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
int max_subscriptions_per_client; // Default: 20
|
int max_subscriptions_per_client; // Default: 20
|
||||||
|
|||||||
Reference in New Issue
Block a user