@@ -35,8 +35,58 @@ void ShubInitParams(ShubParams* params)
3535 params -> queue_size = 100 ;
3636 params -> max_attempts = 10 ;
3737 params -> error_handler = default_error_handler ;
38+ params -> leader = NULL ;
3839}
3940
41+ void ShubParamsSetHosts (ShubParams * params , char * hoststring )
42+ {
43+ char * hstate , * pstate ;
44+ char * hostport , * host , * portstr ;
45+ int port ;
46+
47+ char * hosts = strdup (hoststring );
48+ fprintf (stderr , "sockhub parsing hosts = '%s'\n" , hosts );
49+ hostport = strtok_r (hosts , "," , & hstate );
50+
51+ while (hostport ) {
52+ fprintf (stderr , "hostport = '%s'\n" , hostport );
53+ host = strtok_r (hostport , ":" , & pstate );
54+ if (!host ) {
55+ fprintf (stderr , "wrong host in host list\n" );
56+ break ;
57+ }
58+
59+ portstr = strtok_r (NULL , ":" , & pstate );
60+ if (portstr ) {
61+ port = atoi (portstr );
62+ } else {
63+ port = 5431 ;
64+ }
65+
66+ fprintf (stderr , "adding host %s:%d\n" , host , port );
67+ host_t * h = malloc (sizeof (host_t ));
68+ h -> host = strdup (host );
69+ h -> port = port ;
70+ if (params -> leader ) {
71+ // update pointers from
72+ h -> prev = params -> leader -> prev ;
73+ h -> next = params -> leader ;
74+
75+ // update pointers to
76+ h -> prev -> next = h ;
77+ h -> next -> prev = h ;
78+ } else {
79+ // the list is empty
80+ params -> leader = h ;
81+ h -> prev = h ;
82+ h -> next = h ;
83+ }
84+
85+ hostport = strtok_r (NULL , "," , & hstate );
86+ }
87+
88+ free (hosts );
89+ }
4090
4191static int resolve_host_by_name (const char * hostname , unsigned * addrs , unsigned * n_addrs )
4292{
@@ -103,57 +153,37 @@ int ShubWriteSocket(int sd, void const* buf, int size)
103153 return 1 ;
104154}
105155
106-
107156static void reconnect (Shub * shub )
108157{
109- static int skip_hosts = 0 ;
110- printf ("will connect to host #%d\n" , skip_hosts );
111-
112158 struct sockaddr_in sock_inet ;
113159 unsigned addrs [128 ];
114160 unsigned i , n_addrs = sizeof (addrs ) / sizeof (addrs [0 ]);
115161 int max_attempts = shub -> params -> max_attempts ;
116- char * hosts = strdup (shub -> params -> hosts );
117162 if (shub -> output >= 0 ) {
118163 close_socket (shub , shub -> output );
119164 }
120165
121166 sock_inet .sin_family = AF_INET ;
122167
123- char * hstate , * pstate ;
124- char * hostport , * host , * portstr ;
125- int port ;
126- hostport = strtok_r (hosts , "," , & hstate );
127- int hosti = 0 ;
128- while (hostport ) {
129- ShubErrorSeverity severity = SHUB_RECOVERABLE_ERROR ;
168+ while (shub -> params -> leader ) {
169+ char * host = shub -> params -> leader -> host ;
170+ int port = shub -> params -> leader -> port ;
130171
131- if (hosti < skip_hosts ) {
132- goto trynext ;
133- }
172+ fprintf (stderr , "shub leader = %s:%d\n" , host , port );
134173
135- host = strtok_r (hostport , ":" , & pstate );
136- if (!host ) {
137- severity = SHUB_FATAL_ERROR ;
138- break ;
139- }
174+ shub -> params -> leader = shub -> params -> leader -> next ;
140175
141- portstr = strtok_r (NULL , ":" , & pstate );
142- if (portstr ) {
143- port = atoi (portstr );
144- } else {
145- port = 5431 ;
146- }
176+ ShubErrorSeverity severity = SHUB_RECOVERABLE_ERROR ;
147177 sock_inet .sin_port = htons (port );
148178
149179 if (!resolve_host_by_name (host , addrs , & n_addrs )) {
150180 shub -> params -> error_handler ("Failed to resolve host by name" , severity );
151- goto trynext ;
181+ continue ;
152182 }
153183 shub -> output = socket (AF_INET , SOCK_STREAM , 0 );
154184 if (shub -> output < 0 ) {
155185 shub -> params -> error_handler ("Failed to create inet socket" , severity );
156- goto trynext ;
186+ continue ;
157187 }
158188 while (1 ) {
159189 int rc = -1 ;
@@ -170,32 +200,22 @@ static void reconnect(Shub* shub)
170200 if (rc < 0 ) {
171201 if (errno != ENOENT && errno != ECONNREFUSED && errno != EINPROGRESS ) {
172202 shub -> params -> error_handler ("Connection can not be establish" , severity );
173- goto trynext ;
203+ continue ;
174204 }
175205 if (max_attempts -- != 0 ) {
176206 sleep (1 );
177207 } else {
178208 shub -> params -> error_handler ("Failed to connect to host" , severity );
179- goto trynext ;
209+ continue ;
180210 }
181211 } else {
182212 int optval = 1 ;
183213 setsockopt (shub -> output , IPPROTO_TCP , TCP_NODELAY , (char const * )& optval , sizeof (optval ));
184214 FD_SET (shub -> output , & shub -> inset );
185- goto finish ;
215+ return ;
186216 }
187217 }
188- trynext :
189- hostport = strtok_r (NULL , "," , & hstate );
190- hosti ++ ;
191- }
192- finish :
193- if (hosti < skip_hosts ) {
194- skip_hosts = 0 ;
195- } else {
196- skip_hosts ++ ;
197218 }
198- free (hosts );
199219}
200220
201221static void notify_disconnect (Shub * shub , int chan )
0 commit comments