Skip to content

Commit

Permalink
Merge pull request #57 from jfsmig/master
Browse files Browse the repository at this point in the history
SDK improvements, Proxy fixes
  • Loading branch information
Julien Kasarherou committed Jun 21, 2015
2 parents 4384825 + 1852d52 commit 10fb30f
Show file tree
Hide file tree
Showing 72 changed files with 1,811 additions and 1,065 deletions.
4 changes: 2 additions & 2 deletions client/c/lib/containers.c
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,7 @@ gs_container_reconnect_and_refresh (gs_container_t *container, GError **err, gbo
// Checking connection is not sufficient (is it even useful?),
// we must check if container is there.
gchar addr[STRLEN_ADDRINFO];
addr_info_to_string(&(container->meta2_addr), addr, STRLEN_ADDRINFO);
addr_info_to_string(&(container->meta2_addr), addr, sizeof(addr));
do {
struct hc_url_s *url = hc_url_empty ();
hc_url_set (url, HCURL_NS, gs_get_full_namespace(container->info.gs));
Expand Down Expand Up @@ -876,7 +876,7 @@ _allm2(gs_container_t *container, gchar ***targets)
for (l=allm2,p=*targets; l ;l=l->next,p++) {
struct addr_info_s *ai;
if (NULL != (ai = l->data)) {
gchar straddr[STRLEN_ADDRINFO+1];
gchar straddr[STRLEN_ADDRINFO];
addr_info_to_string(l->data, straddr, sizeof(straddr));
*p = g_strdup(straddr);
}
Expand Down
16 changes: 2 additions & 14 deletions client/c/lib/content_download.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ download_agregate(gs_content_t *content, GSList *agregate, struct dl_status_s *s
{
GSList *l;
GError *local_gerr = NULL;
GError *local_gerr2 = NULL;
struct dl_status_s statusTmp;

*may_reload = FALSE;
Expand Down Expand Up @@ -108,19 +107,8 @@ memcpy(&statusTmp, status, sizeof(struct dl_status_s));
/* then an error with the rawx happened, retry is possible */
switch (local_gerr->code) {
case CODE_CONTENT_CORRUPTED:
/* some bad bytes have been served to the client calback,
* we cannot continue and think it is OK! */
rawx_set_corrupted(&dummy_chunk, &local_gerr2);
if (local_gerr2) {
g_propagate_prefixed_error(gerr, local_gerr2,
"corruption detected: %s, and rename failed: ",
local_gerr->message);
(*gerr)->code = CODE_CONTENT_CORRUPTED;
} else {
GSETCODE(gerr, CODE_CONTENT_CORRUPTED,
"corruption detected: %s", local_gerr->message);
}

GSETCODE(gerr, CODE_CONTENT_CORRUPTED,
"corruption detected: %s", local_gerr->message);
break;
case CODE_NETWORK_ERROR:
if ( previousError && (*gerr)->code != local_gerr->code) {
Expand Down
2 changes: 1 addition & 1 deletion client/c/lib/gs_internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ License along with this library.

#define GSCLIENT_NOINIT 0x01

#define CI_FULLPATHLEN (LIMIT_LENGTH_VOLUMENAME+1+(2*sizeof(chunk_id_t))+1+64)
#define CI_FULLPATHLEN (LIMIT_LENGTH_VOLUMENAME+STRLEN_CHUNKID+64)

#define CODE_RETRY_CONTAINER(C) ((C)==CODE_CONTAINER_LOCKED)

Expand Down
4 changes: 2 additions & 2 deletions client/c/lib/hc_func.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,8 @@ hc_create_container(gs_grid_storage_t *hc, struct hc_url_s *url,
&params, 0, &e);

if (c != NULL) {
gchar m2[STRLEN_ADDRINFO] = {0};
addr_info_to_string(&(c->meta2_addr), m2, STRLEN_ADDRINFO);
gchar m2[STRLEN_ADDRINFO] = "";
addr_info_to_string(&(c->meta2_addr), m2, sizeof(m2));
err = m2v2_remote_execute_HAS(m2, url);
if (err == NULL) {
e = gs_error_new(CODE_CONTAINER_EXISTS,
Expand Down
5 changes: 1 addition & 4 deletions client/c/lib/meta_resolver_explicit.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,15 @@ build_meta0_cache (struct resolver_direct_s *r, GError **err)

/*now call the meta0 reference*/
if (!(m0_list = meta0_remote_get_meta1_all (&(r->meta0), r->timeout.m0.op, err))) {
gchar str_addr[128];
memset(str_addr, 0x00, sizeof(str_addr));
gchar str_addr[STRLEN_ADDRINFO];
addr_info_to_string(&(r->meta0), str_addr, sizeof(str_addr));
GSETERROR (err,"META0 error : Cannot get the reference from %s", str_addr);
return NULL;
}

array = meta0_utils_list_to_array(m0_list);

g_slist_foreach (m0_list, meta0_info_gclean, NULL);
g_slist_free (m0_list);

return array;
}

Expand Down
2 changes: 1 addition & 1 deletion client/c/lib/rainx.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ _chunk_to_sparerawxlist_element(chunk_info_t *chunk_in_error)
g_string_append(res, "|");

char tmpstr[STRLEN_CHUNKHASH];
buffer2str(chunk_in_error->hash, sizeof(chunk_hash_t), tmpstr, STRLEN_CHUNKHASH);
buffer2str(chunk_in_error->hash, sizeof(chunk_hash_t), tmpstr, sizeof(tmpstr));
g_string_append(res, tmpstr);

g_free(rawxlist_element);
Expand Down
158 changes: 0 additions & 158 deletions client/c/lib/rawx.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,164 +103,6 @@ static ne_session* rawx_opensession (gs_chunk_t *chunk, GError **err)

/* ------------------------------------------------------------------------- */

static void
split_chunk_url(const gchar *url, gchar **host, gint *port,
gchar **chunk_hexid, GError **err)
{
gchar **toks = NULL;
gchar **hp = NULL;

toks = g_strsplit(url + 7, "/", 2); // skip "http://" and get "host:port"
if (!toks || g_strv_length(toks) != 2) {
if (err)
*err = NEWERROR(0, "Unparsable chunk URL format: '%s'", url);
goto end;
}
hp = g_strsplit(toks[0], ":", 2); // split host and port
if (!hp || g_strv_length(hp) != 2) {
if (err)
*err = NEWERROR(0, "Could not extract host and port: '%s'", toks[0]);
goto end;
}

*host = g_strdup(hp[0]);
*port = atoi(hp[1]);
*chunk_hexid = g_strdup(strrchr(url, '/'));

end:
g_strfreev(hp);
g_strfreev(toks);
}

/**
* Extract host, port and chunk hexadecimal id from a bean.
*
* @param bean A pointer to a bean_CHUNKS_s or bean_CONTENTS_s
* @param[out] host
* @param[out] port
* @param[out] chunk_hexid The chunk hexadecimal id (with leading '/')
* @param[out] err
*/
static void
extract_chunk_url(gpointer bean, gchar **host, gint *port, gchar **chunk_hexid, GError **err)
{
gchar *cid_url = NULL;
if (DESCR(bean) == &descr_struct_CHUNKS) {
cid_url = CHUNKS_get_id((struct bean_CHUNKS_s*)bean)->str;
} else if (DESCR(bean) == &descr_struct_CONTENTS) {
cid_url = CONTENTS_get_chunk_id((struct bean_CONTENTS_s*)bean)->str;
} else {
if (err)
*err = NEWERROR(0, "Invalid 'bean' argument, must be "
"(struct bean_CHUNKS_s*) or (struct bean_CONTENTS_s*)");
else
return;
}
return split_chunk_url(cid_url, host, port, chunk_hexid, err);
}

static gboolean
_ne_request(const char *host, int port, const char *target,
const char *method, GSList *headers, GError **err)
{
GRID_TRACE("%s", __FUNCTION__);
gboolean result = FALSE;
ne_session* session = ne_session_create("http", host, port);
ne_set_connect_timeout(session, 10);
ne_set_read_timeout(session, 30);

GRID_DEBUG("%s http://%s:%d%s", method, host, port, target);
ne_request* req = ne_request_create(session, method, target);
if (NULL != req) {
for (GSList *l = headers; l; l = l->next) {
gchar **toks = g_strsplit(l->data, ":", 2);
ne_add_request_header(req, toks[0], toks[1]);
g_strfreev(toks);
}
switch (ne_request_dispatch(req)) {
case NE_OK:
if (ne_get_status(req)->klass != 2) {
*err = NEWERROR(0, "cannot %s '%s' (%s)", method, target,
ne_get_error(session));
} else {
result = TRUE;
}
break;
case NE_AUTH:
case NE_CONNECT:
case NE_TIMEOUT:
case NE_ERROR:
default:
*err = NEWERROR(0,
"unexpected error from the WebDAV server (%s)",
ne_get_error(session));
break;
}
ne_request_destroy(req);
} else {
// This should be an assertion
*err = NEWERROR(0, "Failed to create request");
}
ne_session_destroy (session);
return result;
}

static void
_rawx_set_corrupted(gchar *host, gint port, gchar *cid_hex, GError **err)
{
gchar *dst_header = NULL;
GSList *headers = NULL;

// Rename chunk with ".corrupted" suffix, using "MOVE" WebDAV method
dst_header = g_strdup_printf("Destination: http://%s:%d%s.corrupted",
host, port, cid_hex);
headers = g_slist_prepend(headers, dst_header);
_ne_request(host, port, cid_hex, "MOVE", headers, err);

g_slist_free(headers);
g_free(dst_header);
}

gs_status_t
rawx_set_corrupted(gs_chunk_t *chunk, GError **err)
{
gchar cid_hex[66] = {'/', 0};
gchar host[128] = {0};
gint port = 0;

EXTRA_ASSERT(chunk != NULL);
EXTRA_ASSERT(err != NULL);
g_clear_error(err);

addr_info_get_addr(&(chunk->ci->id.addr), host, sizeof(host), (guint16*)&port);
container_id_to_string(chunk->ci->id.id, cid_hex+1, sizeof(cid_hex)-1);

_rawx_set_corrupted(host, port, cid_hex, err);
return (*err == NULL)? GS_OK:GS_ERROR;
}

gboolean
rawx_set_corrupted_v2(gpointer chunk, GError **err)
{
gchar *cid_hex = NULL;
gchar *host = NULL;
gint port = 0;

EXTRA_ASSERT(chunk != NULL);
EXTRA_ASSERT(err != NULL);
g_clear_error(err);

extract_chunk_url(chunk, &host, &port, &cid_hex, err);
if (err && *err)
goto end;
_rawx_set_corrupted(host, port, cid_hex, err);

end:
g_free(host);
g_free(cid_hex);
return (*err == NULL);
}

char*
create_rawx_request_common(ne_request **req, ne_request_param_t *param, GError **err)
{
Expand Down
18 changes: 0 additions & 18 deletions client/c/lib/rawx.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,24 +46,6 @@ struct chunk_attr_s {
const char *val;
};

/**
* Tell a RawX a chunk is corrupted (rename it with ".corrupted" extension),
* so future GET will return 404 instead of corrupted data.
*
* @param chunk A pointer to a gs_chunk_t instance
* @param[out] err A pointer to a GError (required)
*/
gs_status_t rawx_set_corrupted(gs_chunk_t *chunk, GError **err);

/**
* Tell a RawX a chunk is corrupted (rename it with ".corrupted" extension),
* so future GET will return 404 instead of corrupted data.
*
* @param chunk A pointer to a bean_CHUNKS_s or bean_CONTENTS_s instance
* @param[out] err A pointer to a GError (required)
*/
gboolean rawx_set_corrupted_v2(gpointer chunk, GError **err);

/* */
gboolean rawx_download (gs_chunk_t *chunk, GError **err,
struct dl_status_s *status, GSList **p_broken_rawx_list);
Expand Down
Loading

0 comments on commit 10fb30f

Please sign in to comment.