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);
  }
}
Beispiel #2
0
/**
 * 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
}