Make segment compression/encryption filter to command-line-selectable.
[cumulus.git] / scandir.cc
index 26b83ed..3634b59 100644 (file)
@@ -68,7 +68,7 @@ void metadata_flush()
 
     /* Write current metadata information to a new object. */
     LbsObject *meta = new LbsObject;
-    meta->set_group("root");
+    meta->set_group("metadata");
     meta->set_data(m.data(), m.size());
     meta->write(tss);
     meta->checksum();
@@ -145,7 +145,20 @@ int64_t dumpfile(int fd, dictionary &file_info)
         // Store a copy of the object if one does not yet exist
         if (ref.get_segment().size() == 0) {
             LbsObject *o = new LbsObject;
-            o->set_group("data");
+
+            /* We might still have seen this checksum before, if the object was
+             * stored at some time in the past, but we have decided to clean
+             * the segment the object was originally stored in (FindObject will
+             * not return such objects).  When rewriting the object contents,
+             * put it in a separate group, so that old objects get grouped
+             * together.  The hope is that these old objects will continue to
+             * be used in the future, and we obtain segments which will
+             * continue to be well-utilized. */
+            if (db->IsOldObject(block_csum, bytes))
+                o->set_group("compacted");
+            else
+                o->set_group("data");
+
             o->set_data(block_buf, bytes);
             o->write(tss);
             ref = o->get_ref();
@@ -181,7 +194,7 @@ int64_t dumpfile(int fd, dictionary &file_info)
         }
 
         LbsObject *i = new LbsObject;
-        i->set_group("indirect");
+        i->set_group("metadata");
         i->set_data(blocklist.data(), blocklist.size());
         i->write(tss);
         file_info["data"] = "@" + i->get_name();
@@ -390,8 +403,10 @@ int main(int argc, char *argv[])
 
     while (1) {
         static struct option long_options[] = {
-            {"localdb", 1, 0, 0},   // 0
-            {"exclude", 1, 0, 0},   // 1
+            {"localdb", 1, 0, 0},           // 0
+            {"exclude", 1, 0, 0},           // 1
+            {"filter", 1, 0, 0},            // 2
+            {"filter-extension", 1, 0, 0},  // 3
             {NULL, 0, 0, 0},
         };
 
@@ -409,6 +424,12 @@ int main(int argc, char *argv[])
             case 1:     // --exclude
                 excludes.push_back(optarg);
                 break;
+            case 2:     // --filter
+                filter_program = optarg;
+                break;
+            case 3:     // --filter-extension
+                filter_extension = optarg;
+                break;
             default:
                 fprintf(stderr, "Unhandled long option!\n");
                 return 1;
@@ -466,15 +487,16 @@ int main(int argc, char *argv[])
     const string md = metadata_root.str();
 
     LbsObject *root = new LbsObject;
-    root->set_group("root");
+    root->set_group("metadata");
     root->set_data(md.data(), md.size());
     root->write(tss);
     root->checksum();
 
     segment_list.insert(root->get_ref().get_segment());
-    descriptor << "Root: " << root->get_ref().to_string() << "\n";
+    descriptor << "Format: LBS Snapshot v0.1\n";
     strftime(desc_buf, sizeof(desc_buf), "%Y-%m-%d %H:%M:%S %z", &time_buf);
     descriptor << "Date: " << desc_buf << "\n";
+    descriptor << "Root: " << root->get_ref().to_string() << "\n";
 
     delete root;