void kms_sctp_connection_close (KmsSCTPConnection * conn) { GError *err = NULL; g_return_if_fail (conn != NULL); if (conn->socket == NULL) return; if (g_socket_is_closed (conn->socket)) { GST_DEBUG ("Socket is already closed"); return; } if (!g_socket_shutdown (conn->socket, TRUE, TRUE, &err)) { GST_DEBUG ("%s", err->message); g_clear_error (&err); } GST_DEBUG ("Closing socket"); if (!g_socket_close (conn->socket, &err)) { GST_ERROR ("Failed to close socket %p: %s", conn->socket, err->message); g_clear_error (&err); } }
/** * manages an underload situation. If a node has lighter load than sibling * nodes can explicitly request some keys to leverage the load profile. */ void magma_manage_underload() { #if 0 char *path = NULL; char *key = g_strdup(myself.start_key); /* getting forward socket for PFUSE operations */ GSocket *s = magma_get_flare_client_connection(myself.prev->ip_addr); int c; for (c = 0; c < MAGMA_BALANCER_KEY_DELTA; c++) { decrement_key(key); dbg(LOG_INFO, DEBUG_BALANCER, "Requesting key %s from %s", key, myself.prev->node_name); magma_lock_me(); magma_pktqs_get_key(myself.prev->connection, key); magma_pktar_get_key(myself.prev->connection, path); magma_unlock_me(); if (strlen(path) != 0) { magma_flare_t *flare = magma_new_flare(path); if (flare != NULL) { int res, server_errno; /* do a getattr/lstat on flare */ magma_response response; magma_pktqs_getattr(s, 0, 0, path); magma_pktar(s, (gchar *) &response); magma_pktar_getattr(&response); memcpy(&(flare->st), &response.body.getattr.stbuf, sizeof(struct stat)); res = magma_flare_upcast(flare); /* get content if needed */ if (magma_isdir(flare) || magma_isreg(flare) || magma_islnk(flare)) { char *buffer = NULL; size_t size = 0; magma_pktqs_get_key_content(s, key); magma_pktar_get_key_content(s, size, buffer); int fd = -1; if ((fd = magma_open_flare_contents(flare)) != -1) { magma_full_write(fd,buffer,size); close(fd); } } /* tell remote peer to drop key and reduce key space */ magma_pktqs_drop_key(s,key); magma_pktar_drop_key(s,res); if (res != 1) { dbg(LOG_ERR, DEBUG_ERR, "Error: server not dropped key %s", key); } else { magma_lock_me(); strcpy(myself.start_key, key); magma_unlock_me(); magma_lock_node(myself.prev); strcpy(myself.prev->stop_key, key); decrement_key(myself.prev->stop_key); magma_unlock_node(myself.prev); } magma_save_node_profile(); /* dbg(LOG_INFO, DEBUG_BALANCER, "Saving status from manage_underload"); */ magma_save_status(); } else { /******** BIG ERROR!!!! flare can be lost! *********/ /* tell peer to readmit lost key in its keyspace */ /***************************************************/ dbg(LOG_ERR, DEBUG_ERR, "Key content is damaged! Peer should be asked to readmit the key!"); dbg(LOG_ERR, DEBUG_ERR, "Key %s is probably LOST!", key); } } } g_socket_shutdown(s, 1, 1, NULL); dbg(LOG_INFO, DEBUG_BALANCER, "%s says: My first key is %s", myself.node_name, myself.start_key); #endif }