diff --git a/bmc/version-handler/version_handler.cpp b/bmc/version-handler/version_handler.cpp
index 0efdcf7..f26884b 100644
--- a/bmc/version-handler/version_handler.cpp
+++ b/bmc/version-handler/version_handler.cpp
@@ -23,39 +23,38 @@
         info->handler = std::move(config.handler);
         info->actions->onOpen->setCallback(
             [infoP = info.get()](TriggerableActionInterface& tai) {
-                auto data =
-                    std::make_shared<std::optional<std::vector<uint8_t>>>();
-                do
+            auto data = std::make_shared<std::optional<std::vector<uint8_t>>>();
+            do
+            {
+                if (tai.status() != ActionStatus::success)
                 {
-                    if (tai.status() != ActionStatus::success)
-                    {
-                        fprintf(stderr, "Version file unit failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    if (!infoP->handler->open("", std::ios::in))
-                    {
-                        fprintf(stderr, "Opening version file failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    auto d = infoP->handler->read(
-                        0, std::numeric_limits<uint32_t>::max());
-                    infoP->handler->close();
-                    if (!d)
-                    {
-                        fprintf(stderr, "Reading version file failed for %s\n",
-                                infoP->blobId.c_str());
-                        continue;
-                    }
-                    *data = std::move(d);
-                } while (false);
-                for (auto sessionP : infoP->sessionsToUpdate)
-                {
-                    sessionP->data = data;
+                    fprintf(stderr, "Version file unit failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
                 }
-                infoP->sessionsToUpdate.clear();
-            });
+                if (!infoP->handler->open("", std::ios::in))
+                {
+                    fprintf(stderr, "Opening version file failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
+                }
+                auto d = infoP->handler->read(
+                    0, std::numeric_limits<uint32_t>::max());
+                infoP->handler->close();
+                if (!d)
+                {
+                    fprintf(stderr, "Reading version file failed for %s\n",
+                            infoP->blobId.c_str());
+                    continue;
+                }
+                *data = std::move(d);
+            } while (false);
+            for (auto sessionP : infoP->sessionsToUpdate)
+            {
+                sessionP->data = data;
+            }
+            infoP->sessionsToUpdate.clear();
+        });
         if (!blobInfoMap.try_emplace(info->blobId, std::move(info)).second)
         {
             fprintf(stderr, "Ignoring duplicate config for %s\n",
@@ -170,8 +169,8 @@
     }
     else
     {
-        meta->blobState =
-            blobs::StateFlags::committed | blobs::StateFlags::open_read;
+        meta->blobState = blobs::StateFlags::committed |
+                          blobs::StateFlags::open_read;
         meta->size = (*data)->size();
     }
     return true;
