Skip to content

Commit 28ec432

Browse files
committed
Use `cluster_free` in `free_cluster_context` to free cluster object. Call `cluster_disconnect` before destroying cluster object.
1 parent 97bb6bd commit 28ec432

File tree

4 files changed

+25
-28
lines changed

4 files changed

+25
-28
lines changed

cluster_library.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -831,9 +831,14 @@ PHP_REDIS_API redisCluster *cluster_create(double timeout, double read_timeout,
831831
return c;
832832
}
833833

834-
PHP_REDIS_API void cluster_free(redisCluster *c) {
834+
PHP_REDIS_API void
835+
cluster_free(redisCluster *c, int free_ctx TSRMLS_DC)
836+
{
837+
/* Disconnect from each node we're connected to */
838+
cluster_disconnect(c TSRMLS_CC);
839+
835840
/* Free any allocated prefix */
836-
if (c->flags->prefix) efree(c->flags->prefix);
841+
if (c->flags->prefix) zend_string_release(c->flags->prefix);
837842
efree(c->flags);
838843

839844
/* Call hash table destructors */
@@ -848,7 +853,7 @@ PHP_REDIS_API void cluster_free(redisCluster *c) {
848853
if (c->err) zend_string_release(c->err);
849854

850855
/* Free structure itself */
851-
efree(c);
856+
if (free_ctx) efree(c);
852857
}
853858

854859
/* Takes our input hash table and returns a straigt C array with elements,
@@ -1069,7 +1074,7 @@ PHP_REDIS_API void cluster_disconnect(redisCluster *c TSRMLS_DC) {
10691074
redisClusterNode *node;
10701075

10711076
ZEND_HASH_FOREACH_PTR(c->nodes, node) {
1072-
if (node == NULL) break;
1077+
if (node == NULL) continue;
10731078
redis_sock_disconnect(node->sock TSRMLS_CC);
10741079
node->sock->lazy_connect = 1;
10751080
} ZEND_HASH_FOREACH_END();

cluster_library.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ PHP_REDIS_API int cluster_send_slot(redisCluster *c, short slot, char *cmd,
368368

369369
PHP_REDIS_API redisCluster *cluster_create(double timeout, double read_timeout,
370370
int failover, int persistent);
371-
PHP_REDIS_API void cluster_free(redisCluster *c);
371+
PHP_REDIS_API void cluster_free(redisCluster *c, int free_ctx TSRMLS_DC);
372372
PHP_REDIS_API int cluster_init_seeds(redisCluster *c, HashTable *ht_seeds);
373373
PHP_REDIS_API int cluster_map_keyspace(redisCluster *c TSRMLS_DC);
374374
PHP_REDIS_API void cluster_free_node(redisClusterNode *node);

redis_cluster.c

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -362,34 +362,26 @@ create_cluster_context(zend_class_entry *class_type TSRMLS_DC) {
362362
}
363363

364364
/* Free redisCluster context */
365-
void
366365
#if (PHP_MAJOR_VERSION < 7)
367-
free_cluster_context(void *object TSRMLS_DC) {
366+
void
367+
free_cluster_context(void *object TSRMLS_DC)
368+
{
368369
redisCluster *cluster = (redisCluster*)object;
370+
371+
cluster_free(cluster, 0 TSRMLS_CC);
372+
zend_object_std_dtor(&cluster->std TSRMLS_CC);
373+
efree(cluster);
374+
}
369375
#else
370-
free_cluster_context(zend_object *object) {
376+
void
377+
free_cluster_context(zend_object *object)
378+
{
371379
redisCluster *cluster = (redisCluster*)((char*)(object) - XtOffsetOf(redisCluster, std));
372-
#endif
373-
// Free any allocated prefix, as well as the struct
374-
if (cluster->flags->prefix) efree(cluster->flags->prefix);
375-
efree(cluster->flags);
376-
377-
// Free seeds HashTable itself
378-
zend_hash_destroy(cluster->seeds);
379-
efree(cluster->seeds);
380-
381-
// Destroy all Redis objects and free our nodes HashTable
382-
zend_hash_destroy(cluster->nodes);
383-
efree(cluster->nodes);
384-
385-
if (cluster->err) zend_string_release(cluster->err);
386380

381+
cluster_free(cluster, 0 TSRMLS_CC);
387382
zend_object_std_dtor(&cluster->std TSRMLS_CC);
388-
389-
#if (PHP_MAJOR_VERSION < 7)
390-
efree(cluster);
391-
#endif
392383
}
384+
#endif
393385

394386
/* Attempt to connect to a Redis cluster provided seeds and timeout options */
395387
void redis_cluster_init(redisCluster *c, HashTable *ht_seeds, double timeout,

redis_session.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ PS_OPEN_FUNC(rediscluster) {
947947
PS_SET_MOD_DATA(c);
948948
retval = SUCCESS;
949949
} else {
950-
cluster_free(c);
950+
cluster_free(c, 1 TSRMLS_CC);
951951
retval = FAILURE;
952952
}
953953

@@ -1108,7 +1108,7 @@ PS_CLOSE_FUNC(rediscluster)
11081108
{
11091109
redisCluster *c = PS_GET_MOD_DATA();
11101110
if (c) {
1111-
cluster_free(c);
1111+
cluster_free(c, 1 TSRMLS_CC);
11121112
PS_SET_MOD_DATA(NULL);
11131113
}
11141114
return SUCCESS;

0 commit comments

Comments
 (0)