long message_archive_backend( const char *req_url, int num_restarts ) { TCRDB *conn = tcrdbnew(); long port = 0; bool is_open = false; char* backend_config = NULL; /* fprintf( stderr, "Connecting to primary %s at port %d\n", keyspace_server_primary_config.host, keyspace_server_primary_config.port ); */ is_open = tcrdbopen( conn, keyspace_server_primary_config.host, keyspace_server_primary_config.port ); if ( !is_open ) { int ecode = tcrdbecode( conn ); fprintf( stderr, "tcrdbopen : %d : %s\n", errno, strerror( errno )); fprintf( stderr, "(%s) Failed to open primary, attempting backup : %d : %s\n", req_url, ecode, tcrdberrmsg( ecode )); fprintf( stderr, "(%s) Connecting to backup %s at port %d\n", req_url, keyspace_server_backup_config.host, keyspace_server_backup_config.port ); is_open = tcrdbopen( conn, keyspace_server_backup_config.host, keyspace_server_backup_config.port ); if ( !is_open) { int ecode = tcrdbecode( conn ); fprintf( stderr, "(%s) Failed to open backup : %d : %s\n", req_url, ecode, tcrdberrmsg( ecode )); return -503; } } /* fprintf( stderr, "Calling backend_for '%s'\n", req_url); */ backend_config = tcrdbext2( conn, "backend_for", RDBXOLCKGLB, req_url, ( (0 == num_restarts) ? "primary" : "backup" ) ); /* if there is a backend config, get the port number */ if ( NULL != backend_config ) { /* fprintf( stderr, "Received a response %s\n", backend_config); */ char *colon = strrchr( backend_config, ':' ); /* colon found attempt to convert to a long */ if ( NULL != colon ) { colon++; /* move past the colon itself */ port = strtol( colon, NULL, 10 ); /* unable to convert to a good number */ if ( 0 == port || LONG_MIN == port || LONG_MAX == port ) { port = -1; } } else { /* no port number found */ port = 0; } } else { port = -404; } if ( !tcrdbclose( conn ) ) { fprintf( stderr, "(%s) Unable to close tcrdb connection\n", req_url); } tcrdbdel( conn ); free( backend_config ); return port; }