{"id":62942,"date":"2022-04-14T10:47:23","date_gmt":"2022-04-14T14:47:23","guid":{"rendered":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/?p=62942"},"modified":"2023-04-27T13:15:29","modified_gmt":"2023-04-27T17:15:29","slug":"abstract-buffered-persistence-with-buffered-pronto","status":"publish","type":"post","link":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/","title":{"rendered":"Abstract Buffered Persistence with Buffered Pronto"},"content":{"rendered":"\r\n<h2 class=\"wp-block-heading\">Team<\/h2>\r\n\r\n\r\n\r\n<p>Jack Yu<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Mentors<\/h2>\r\n\r\n\r\n\r\n<p>Michael L. Scott and Sandhya Dwarkadas<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Abstract<\/h2>\r\n\r\n\r\n\r\n<p>This project implements a buffered variant of the Pronto framework used for developing persistent data structures. By relaxing the persistence requirement and processing operations in NVM in bulk, Buffered Pronto is able to achieve 1.2x to 6.7x performance increase while limiting data loss within 1 ms.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Background Information<\/h2>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Non-Volatile Memory (NVM)<\/h3>\r\n\r\n\r\n\r\n<p>NVM is a type of computer memory that does not lose data on power loss. Data structures that use NVM can persist their state on a crash without having to write data to disk.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Pronto<\/h3>\r\n\r\n\r\n\r\n<p>Pronto is a framework that simplifies designing persistent data structures. It provides a way to convert volatile data structures into persistent data structures by annotating which operations modify data.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\r\n\r\n\r\n\r\n<p>Pronto has the following limitations:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Ensuring data structures are always consistent is slow<\/li>\r\n<li>Requires 2x number of processors to perform maintenance tasks quickly<\/li>\r\n<li>All processors contend access on\u00a0 small set of metadata<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Buffered Pronto aims to solve this\u00a0 by only persisting periodically in bulk.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Buffered Pronto Features<\/h2>\r\n\r\n\r\n\r\n<p>My implementation of Buffered Pronto features the following:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Simplified singular fast pace maintenance thread<\/li>\r\n<li>Reduced access to shared metadata<\/li>\r\n<li>Drop-in replacement for original Pronto<\/li>\r\n<li>thread_sync() function to flush the buffer and sync all data immediately<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Performance Evaluation<\/h2>\r\n\r\n\r\n\r\n<p>I compared Buffered Pronto to two variants of the original Pronto system and Montage, a general purpose buffered persistent data structure framework developed here at the University of Rochester.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"319\" data-id=\"79042\" class=\"wp-image-79042\" src=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/NBQueueGraph-1.png\" alt=\"\" srcset=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/NBQueueGraph-1.png 567w, https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/NBQueueGraph-1-300x169.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/>\r\n<figcaption>Throughput comparison on a Non-blocking Concurrent Queue, higher is better<\/figcaption>\r\n<\/figure>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>On a single socket, Buffered Pronto outperforms both variants of Pronto in throughput offering a performance increase of x1.2 to x6.7 depending on the number of threads. While Montage is significantly faster, Pronto annotations is easier to use compared to Montage\u2019s payload-based user library.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"615\" height=\"341\" data-id=\"79052\" class=\"wp-image-79052\" src=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/OpLatencyCompare.png\" alt=\"\" srcset=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/OpLatencyCompare.png 615w, https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/OpLatencyCompare-300x166.png 300w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/>\r\n<figcaption>Operation latency comparison across thread counts, lower is better<\/figcaption>\r\n<\/figure>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>The main reason that Montage outperforms Pronto is that Montage writes data once to NVM, while Pronto needs to write it at least twice. This results in increased operation latency despite Pronto being generally faster during explicit sync() operations.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"319\" data-id=\"79072\" class=\"wp-image-79072\" src=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/ProntoMontageSyncCompare.png\" alt=\"\" srcset=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/ProntoMontageSyncCompare.png 567w, https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/ProntoMontageSyncCompare-300x169.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/>\r\n<figcaption>Sync latency comparison between Buffered Pronto and Montage, lower is better<\/figcaption>\r\n<\/figure>\r\n<\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\">\r\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"567\" height=\"319\" data-id=\"79082\" class=\"wp-image-79082\" src=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/SyncUsable.png\" alt=\"\" srcset=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/SyncUsable.png 567w, https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/SyncUsable-300x169.png 300w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/>\r\n<figcaption>Buffered Pronto sync latency with respect to sync frequency, lower is better<\/figcaption>\r\n<\/figure>\r\n<\/figure>\r\n\r\n\r\n\r\n<p>Pronto\u2019s thread_sync() performs best when called around once per 100 to 1000 operations. thread_sync() latency increases greatly when remote memory access on another socket is involved.<\/p>\r\n\r\n\r\n\r\n<p>The sync latency never increases past 650\u03bcs. Suggesting that regardless of whether thread_sync() is called, data loss is always contained within that time interval.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\r\n\r\n\r\n\r\n<p>Buffered Pronto offers the following over the original Pronto:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Higher throughput with low operation latency<\/li>\r\n<li>Fewer processors needed for maintenance tasks<\/li>\r\n<li>Fully compatible with existing Pronto code<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>The cost of using Buffered Pronto is that data persistence within 1ms is not guaranteed, which should still be acceptable for most applications.<\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Acknowledgements<\/h2>\r\n\r\n\r\n\r\n<p>I would like to thank Dr. Michael Scott for his contribution to buffered durable linearizability and guidance on implementing a buffered version of the Pronto system. I would also like to thank Wentao Cai and Haosen Wen for their assistance in fixing issues with the original Pronto code and for introducing me to the Montage API.<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>A buffered variant of the Pronto persistence framework that provides a 1.26x to x6.77x times performance increase with potential data loss contained within 1ms.<\/p>\n","protected":false},"author":6242,"featured_media":137392,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[96],"tags":[12472,12462,12452],"coauthors":[8612],"class_list":["post-62942","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csc-archive","tag-buffered-persistence","tag-data-structures","tag-persistent-memory"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Abstract Buffered Persistence with Buffered Pronto - Senior Design Day<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Abstract Buffered Persistence with Buffered Pronto - Senior Design Day\" \/>\n<meta property=\"og:description\" content=\"A buffered variant of the Pronto persistence framework that provides a 1.26x to x6.77x times performance increase with potential data loss contained within 1ms.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/\" \/>\n<meta property=\"og:site_name\" content=\"Senior Design Day\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-14T14:47:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-27T17:15:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"840\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/#\\\/schema\\\/person\\\/351018fbcf84ed8cac6d8072ba5b347c\"},\"headline\":\"Abstract Buffered Persistence with Buffered Pronto\",\"datePublished\":\"2022-04-14T14:47:23+00:00\",\"dateModified\":\"2023-04-27T17:15:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/\"},\"wordCount\":532,\"image\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg\",\"keywords\":[\"Buffered Persistence\",\"Data Structures\",\"Persistent Memory\"],\"articleSection\":[\"CSC Archive\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/\",\"url\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/\",\"name\":\"Abstract Buffered Persistence with Buffered Pronto - Senior Design Day\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg\",\"datePublished\":\"2022-04-14T14:47:23+00:00\",\"dateModified\":\"2023-04-27T17:15:29+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/#\\\/schema\\\/person\\\/351018fbcf84ed8cac6d8072ba5b347c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg\",\"width\":2560,\"height\":1920},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/abstract-buffered-persistence-with-buffered-pronto\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Abstract Buffered Persistence with Buffered Pronto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/#website\",\"url\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/\",\"name\":\"Senior Design Day\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/#\\\/schema\\\/person\\\/351018fbcf84ed8cac6d8072ba5b347c\",\"name\":\"admin\",\"url\":\"https:\\\/\\\/www.hajim.rochester.edu\\\/senior-design-day\\\/author\\\/seniordesign\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Abstract Buffered Persistence with Buffered Pronto - Senior Design Day","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/","og_locale":"en_US","og_type":"article","og_title":"Abstract Buffered Persistence with Buffered Pronto - Senior Design Day","og_description":"A buffered variant of the Pronto persistence framework that provides a 1.26x to x6.77x times performance increase with potential data loss contained within 1ms.","og_url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/","og_site_name":"Senior Design Day","article_published_time":"2022-04-14T14:47:23+00:00","article_modified_time":"2023-04-27T17:15:29+00:00","og_image":[{"url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg","width":840,"height":630,"type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#article","isPartOf":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/"},"author":{"name":"admin","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/#\/schema\/person\/351018fbcf84ed8cac6d8072ba5b347c"},"headline":"Abstract Buffered Persistence with Buffered Pronto","datePublished":"2022-04-14T14:47:23+00:00","dateModified":"2023-04-27T17:15:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/"},"wordCount":532,"image":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg","keywords":["Buffered Persistence","Data Structures","Persistent Memory"],"articleSection":["CSC Archive"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/","url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/","name":"Abstract Buffered Persistence with Buffered Pronto - Senior Design Day","isPartOf":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#primaryimage"},"image":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg","datePublished":"2022-04-14T14:47:23+00:00","dateModified":"2023-04-27T17:15:29+00:00","author":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/#\/schema\/person\/351018fbcf84ed8cac6d8072ba5b347c"},"breadcrumb":{"@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#primaryimage","url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg","contentUrl":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-content\/uploads\/2022\/04\/Abstract-Buffered-Persistence-with-Buffered-Pronto-Poster-scaled.jpg","width":2560,"height":1920},{"@type":"BreadcrumbList","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/abstract-buffered-persistence-with-buffered-pronto\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/"},{"@type":"ListItem","position":2,"name":"Abstract Buffered Persistence with Buffered Pronto"}]},{"@type":"WebSite","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/#website","url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/","name":"Senior Design Day","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/#\/schema\/person\/351018fbcf84ed8cac6d8072ba5b347c","name":"admin","url":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/author\/seniordesign\/"}]}},"_links":{"self":[{"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/posts\/62942","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/users\/6242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/comments?post=62942"}],"version-history":[{"count":14,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/posts\/62942\/revisions"}],"predecessor-version":[{"id":137342,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/posts\/62942\/revisions\/137342"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/media\/137392"}],"wp:attachment":[{"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/media?parent=62942"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/categories?post=62942"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/tags?post=62942"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.hajim.rochester.edu\/senior-design-day\/wp-json\/wp\/v2\/coauthors?post=62942"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}