We continue to advance towards redundant data. To that end this patch
retires 3 FIXMEs and, sadly, adds one.

We also throw an improvement to "Good Socket, but ..." message.
It's caused by a harmless bug in Chunk on which we want to keep tabs.

Signed-off-by: Pete Zaitcev <[email protected]>

diff -urp -X dontdiff tabled/server/object.c tabled-m/server/object.c
--- tabled/server/object.c      2009-09-29 09:18:25.070156921 -0600
+++ tabled-m/server/object.c    2009-09-30 19:26:33.338814552 -0600
@@ -124,25 +124,34 @@ bool object_del_acls(DB_TXN *txn, const 
        return true;
 }
 
-static int object_unlink(struct db_obj_ent *obj)
+static void object_unlink(struct db_obj_ent *obj)
 {
        struct db_obj_addr *addr;
+       int i;
        struct storage_node *stnode;
+       int rc;
 
        if (GUINT32_FROM_LE(obj->flags) & DB_OBJ_INLINE)
-               return 0;
-       /*
-        * FIXME Iterate over all of NIDs when redundancy is added;
-        * use nid to locate node in all_stor.
-        */
+               return;
        addr = &obj->d.a;
 
-       if (list_empty(&tabled_srv.all_stor))
-               return -EIO;
-       stnode = list_entry(tabled_srv.all_stor.next,
-                           struct storage_node, all_link);
+       for (i = 0; i < MAXWAY; i++) {
+               uint32_t nid;
 
-       return stor_obj_del(stnode, GUINT64_FROM_LE(addr->oid));
+               nid = GUINT32_FROM_LE(addr->nidv[i]);
+               if (!nid)
+                       continue;
+               stnode = stor_node_by_nid(nid);
+               if (!stnode)
+                       continue;
+
+               rc = stor_obj_del(stnode, GUINT64_FROM_LE(addr->oid));
+               if (rc)
+                       applog(LOG_ERR,
+                              "object data(%llX) unlink failed on nid %u",
+                              (unsigned long long) GUINT64_FROM_LE(addr->oid),
+                              nid);
+       }
 }
 
 bool object_del(struct client *cli, const char *user,
@@ -204,9 +213,7 @@ bool object_del(struct client *cli, cons
                return cli_err(cli, InternalError);
        }
 
-       if (object_unlink(&obje) < 0)
-               applog(LOG_ERR, "object data(%llX) unlink failed",
-                      (unsigned long long) cli->in_objid);
+       object_unlink(&obje);
        if (asprintf(&hdr,
 "HTTP/%d.%d 204 x\r\n"
 "Content-Length: 0\r\n"
@@ -311,6 +318,7 @@ static bool object_put_end(struct client
        struct list_head *pos, *tmp;
        int nok;
        enum errcode err = InternalError;
+       struct db_obj_addr obj_addr;
        struct db_obj_ent *obj;
        struct db_obj_key *obj_key;
        struct db_obj_ent oldobj;
@@ -331,6 +339,8 @@ static bool object_put_end(struct client
        else
                cli->state = evt_dispose;
 
+       memset(&obj_addr, 0, sizeof(struct db_obj_addr));
+       obj_addr.oid = GUINT64_TO_LE(cli->out_objid);
        nok = 0;
        list_for_each_safe(pos, tmp, &cli->out_ch) {
                struct open_chunk *ochunk;
@@ -349,6 +359,7 @@ static bool object_put_end(struct client
                                        applog(LOG_DEBUG, "STORED %llX, size -",
                                               (unsigned long long) 
cli->out_objid);
                        }
+                       obj_addr.nidv[nok] = GUINT32_TO_LE(ochunk->node->id);
                        nok++;
                }
                stor_close(ochunk);
@@ -435,8 +446,7 @@ static bool object_put_end(struct client
        /* encode object header */
        obj->size = cli->out_size;
        obj->mtime = (uint64_t)time(NULL) * 1000000;
-       obj->d.a.nidv[0] = GUINT32_TO_LE(1);            /* FIXME */
-       obj->d.a.oid = GUINT64_TO_LE(cli->out_objid);
+       memcpy(&obj->d.a, &obj_addr, sizeof(struct db_obj_addr));
        strncpy(obj->bucket, cli->out_bucket, sizeof(obj->bucket));
        strncpy(obj->owner, cli->out_user, sizeof(obj->owner));
        strncpy(obj->md5, md5, sizeof(obj->md5));
@@ -480,10 +490,8 @@ static bool object_put_end(struct client
        /* now that all database manipulation has been a success,
         * we can remove the old object (overwritten) data.
         */
-       if (delobj && object_unlink(&oldobj) < 0) {
-               applog(LOG_ERR, "object data(%llX) orphaned",
-                      (unsigned long long) GUINT64_FROM_LE(oldobj.d.a.oid));
-       }
+       if (delobj)
+               object_unlink(&oldobj);
 
        free(cli->out_bucket);
        free(cli->out_key);
@@ -724,6 +732,8 @@ static int open_chunks(struct list_head 
 
        n = 0;
        list_for_each_entry(stnode, slist, all_link) {
+               if (n >= MAXWAY)
+                       break;
                if (!stnode->up)
                        continue;
                ochunk = open_chunk1(stnode, objid, content_len);
@@ -1034,17 +1044,9 @@ static bool object_get_more(struct clien
 }
 
 /* callback from the chunkd side: some data is available */
-static void object_get_event(struct open_chunk *cep)
+static void object_get_event(struct open_chunk *ochunk)
 {
-       struct client *cli;
-       unsigned char *p;
-
-       /* FIXME what's the name of this ideom? parentof()? */
-       p = (unsigned char *)cep;
-       p -= ((unsigned long) &((struct client *)0)->in_ce);  /* offsetof */
-       cli = (struct client *) p;
-
-       object_get_poke(cli);
+       object_get_poke(ochunk->cli);
 }
 
 bool object_get_body(struct client *cli, const char *user, const char *bucket,
@@ -1148,12 +1150,21 @@ bool object_get_body(struct client *cli,
 
        cli->in_objid = GUINT64_FROM_LE(obj->d.a.oid);
 
-       if (list_empty(&tabled_srv.all_stor)) {
-               applog(LOG_ERR, "No chunk nodes");
-               goto err_out_str;
+       for (i = 0; i < MAXWAY; i++ ) {
+               uint32_t nid;
+
+               nid = GUINT32_FROM_LE(obj->d.a.nidv[0]);
+               if (!nid)
+                       continue;
+               stnode = stor_node_by_nid(nid);
+               if (stnode)             /* FIXME temporarily 1-way */
+                       break;
+
+               applog(LOG_ERR, "No chunk node nid %u for oid %llX",
+                      nid, cli->in_objid);
        }
-       stnode = list_entry(tabled_srv.all_stor.next,
-                           struct storage_node, all_link);
+       if (!stnode)
+               goto err_out_str;
 
        rc = stor_open(&cli->in_ce, stnode);
        if (rc < 0) {
@@ -1169,6 +1180,7 @@ bool object_get_body(struct client *cli,
                       (unsigned long long) cli->in_objid, stnode->id, rc);
                goto err_out_str;
        }
+       cli->in_ce.cli = cli;
 
        hdr = req_hdr(&cli->req, "if-unmodified-since");
        if (hdr) {
diff -urp -X dontdiff tabled/server/storage.c tabled-m/server/storage.c
--- tabled/server/storage.c     2009-09-30 19:11:04.854874868 -0600
+++ tabled-m/server/storage.c   2009-09-30 19:26:33.341815126 -0600
@@ -342,7 +342,7 @@ bool stor_obj_test(struct open_chunk *ce
        return true;
 }
 
-static struct storage_node *stor_node_by_nid(uint32_t nid)
+struct storage_node *stor_node_by_nid(uint32_t nid)
 {
        struct storage_node *sn;
 
diff -urp -X dontdiff tabled/server/storparse.c tabled-m/server/storparse.c
--- tabled/server/storparse.c   2009-08-29 13:03:09.129481061 -0600
+++ tabled-m/server/storparse.c 2009-09-30 19:26:33.343813430 -0600
@@ -102,16 +102,19 @@ static void cfg_elm_end_storage(struct c
 
        /* FIXME Chunkd with SSL needs certs, or else it's security theater. */
        if (cc->stor_encrypt) {
-               applog(LOG_WARNING, "%s: Good Socket, but "
+               applog(LOG_WARNING, "%s: Good Socket (%s,%s), but "
                       "SSL access to Chunk is not supported yet",
-                      cc->fname);
+                      cc->fname,
+                      cc->stor_host, cc->stor_port);
                goto end;
        }
 
        if (cc->stor_ok) {
-               applog(LOG_WARNING, "%s: Good Socket, but "
-                      "multihomed Chunk is not supported yet",
-                      cc->fname);
+               applog(LOG_WARNING, "%s: Good Socket (%s,%s), but "
+                      "multihomed Chunk is not supported yet, using (%s,%s)",
+                      cc->fname,
+                      cc->stor_host, cc->stor_port,
+                      cc->stor_ok_host, cc->stor_ok_port);
                goto end;
        }
 
diff -urp -X dontdiff tabled/server/tabled.h tabled-m/server/tabled.h
--- tabled/server/tabled.h      2009-09-29 09:18:25.075156919 -0600
+++ tabled-m/server/tabled.h    2009-09-30 19:26:33.346784216 -0600
@@ -333,6 +333,7 @@ extern bool stor_put_end(struct open_chu
 extern ssize_t stor_get_buf(struct open_chunk *cep, void *data, size_t len);
 extern int stor_obj_del(struct storage_node *stn, uint64_t key);
 extern bool stor_obj_test(struct open_chunk *cep, uint64_t key);
+extern struct storage_node *stor_node_by_nid(uint32_t nid);
 extern void stor_add_node(uint32_t nid, const char *hostname,
                          const char *portstr, struct geo *locp);
 extern int stor_node_check(struct storage_node *stn);
--
To unsubscribe from this list: send the line "unsubscribe hail-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to