summaryrefslogtreecommitdiffstats
path: root/src/server/altservers.c
diff options
context:
space:
mode:
authorSimon Rettberg2013-08-12 18:04:39 +0200
committerSimon Rettberg2013-08-12 18:04:39 +0200
commita1dd0acdbdd6a9b70f9d7aa447e323f2072c650a (patch)
treeea67a4cc5c3dd003184bb13ccfaf3fa90c42720c /src/server/altservers.c
parentI'm stupid (diff)
downloaddnbd3-a1dd0acdbdd6a9b70f9d7aa447e323f2072c650a.tar.gz
dnbd3-a1dd0acdbdd6a9b70f9d7aa447e323f2072c650a.tar.xz
dnbd3-a1dd0acdbdd6a9b70f9d7aa447e323f2072c650a.zip
[SERVER] Improve proxy mode, implement integrity check in proxy mode
Diffstat (limited to 'src/server/altservers.c')
-rw-r--r--src/server/altservers.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/server/altservers.c b/src/server/altservers.c
index 89c724f..f255b58 100644
--- a/src/server/altservers.c
+++ b/src/server/altservers.c
@@ -107,9 +107,16 @@ int altservers_add(dnbd3_host_t *host, const char *comment)
*/
void altserver_find_uplink(dnbd3_connection_t *uplink)
{
- if ( uplink->rttTestResult == RTT_INPROGRESS ) return;
+ int i;
spin_lock( &pendingLock );
- for (int i = 0; i < SERVER_MAX_PENDING_ALT_CHECKS; ++i) {
+ if ( uplink->rttTestResult == RTT_INPROGRESS ) {
+ for (i = 0; i < SERVER_MAX_PENDING_ALT_CHECKS; ++i) {
+ if ( pending[i] != uplink ) continue;
+ spin_unlock( &pendingLock );
+ return;
+ }
+ }
+ for (i = 0; i < SERVER_MAX_PENDING_ALT_CHECKS; ++i) {
if ( pending[i] != NULL ) continue;
pending[i] = uplink;
uplink->rttTestResult = RTT_INPROGRESS;
@@ -190,8 +197,8 @@ int altservers_get(dnbd3_host_t *output, int size)
{
int count = 0, i, j, num;
spin_lock( &_alts_lock );
- if ( size <= _num_alts ) {
- for (i = 0; i < size; ++i) {
+ if ( size >= _num_alts ) {
+ for (i = 0; i < _num_alts; ++i) {
if ( _alt_servers[i].host.type == 0 ) continue;
output[count++] = _alt_servers[i].host;
}
@@ -426,7 +433,7 @@ static void *altserver_main(void *data)
// Measurement done - everything fine so far
const unsigned int rtt = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; // µs
const unsigned int avg = altservers_update_rtt( &servers[itAlt], rtt );
- if ( is_same_server( &servers[itAlt], &uplink->currentServer ) ) {
+ if ( uplink->fd != -1 && is_same_server( &servers[itAlt], &uplink->currentServer ) ) {
currentRtt = avg;
close( sock );
} else if ( avg < bestRtt ) {