<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Venice Gazette]]></title><description><![CDATA[Venice: Derived Data Platform for Planet-Scale Workloads]]></description><link>https://blog.venicedb.org</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1674764678358/X3Wkwoq8V.png</url><title>Venice Gazette</title><link>https://blog.venicedb.org</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 23 Apr 2026 00:13:10 GMT</lastBuildDate><atom:link href="https://blog.venicedb.org/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[What is HyBRID?]]></title><description><![CDATA[HyBRID is a recursive backronym used as a mnemonic device to remember the purpose of the Hybrid Store Design Pattern. It means: Hybrid Batch/Real-time Ingested Data.]]></description><link>https://blog.venicedb.org/what-is-hybrid</link><guid isPermaLink="true">https://blog.venicedb.org/what-is-hybrid</guid><category><![CDATA[Databases]]></category><category><![CDATA[System Design]]></category><category><![CDATA[design patterns]]></category><category><![CDATA[mnemonic]]></category><category><![CDATA[tricks]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Tue, 12 Aug 2025 20:03:43 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/J59wWPn09BE/upload/5b3704ea51da608ba4515cabf0712721.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>HyBRID is a <a target="_blank" href="https://en.wikipedia.org/wiki/Recursive_acronym">recursive</a> <a target="_blank" href="https://en.wikipedia.org/wiki/Backronym">backronym</a> used as a <a target="_blank" href="https://en.wikipedia.org/wiki/Mnemonic">mnemonic</a> device to remember the purpose of the <a target="_blank" href="https://philosopherping.com/hybrid-store-design-pattern">Hybrid Store Design Pattern</a>. It means: Hybrid Batch/Real-time Ingested Data.</p>
]]></content:encoded></item><item><title><![CDATA[Stable Release 0.4.263]]></title><description><![CDATA[It’s been about a year since the last stable release was announced. The criteria used to determine whether a release is stable are described in a previous post. While there has been many stable releases according to these criteria (10 in the first ha...]]></description><link>https://blog.venicedb.org/stable-release-0-4-263</link><guid isPermaLink="true">https://blog.venicedb.org/stable-release-0-4-263</guid><category><![CDATA[venice]]></category><category><![CDATA[release notes]]></category><category><![CDATA[APIs]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Wed, 26 Jun 2024 06:16:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/mX2mdxhc0UM/upload/8c8f9183ca2bcd225d58c6252372298d.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It’s been about a year since the last stable release was announced. The criteria used to determine whether a release is stable are described in a <a target="_blank" href="https://blog.venicedb.org/stable-releases">previous post</a>. While there has been many stable releases according to these criteria (10 in the first half of 2024), these have not been publicized online. This post rectifies this by going over the highlights since the last stable release.</p>
<p>Release <a target="_blank" href="https://github.com/linkedin/venice/tree/0.4.263">0.4.263</a> is based on commit <a target="_blank" href="https://github.com/linkedin/venice/commit/e95a269470cd65a03e6a357a7d4a1c0aa72b2d59"><strong>e95a269</strong></a>, which was merged on June 4th 2024. There are 501 commits since the last stable release, and <a target="_blank" href="https://github.com/linkedin/venice/graphs/contributors?from=2023-05-17&amp;to=2024-06-04">34 unique contributors</a> (including 14 new ones). Shoutout to the most active committers during that timespan: <a target="_blank" href="https://www.linkedin.com/in/sourav-maji-868769/">Sourav Maji</a>, <a target="_blank" href="https://www.linkedin.com/in/nisargthakkar/">Nisarg Thakkar</a>, <a target="_blank" href="https://www.linkedin.com/in/jialin0630/">Jialin Liu</a> and <a target="_blank" href="https://www.linkedin.com/in/sushantmane/">Sushant Mane</a>!</p>
<h1 id="heading-user-facing-changes">User-Facing Changes</h1>
<p>Let’s start by going over changes to user-facing APIs. There were several additions, and a few removals as well.</p>
<h2 id="heading-write-apis">Write APIs</h2>
<p>The main theme in terms of write APIs is to make it easier to push data to Venice, especially regarding partial update operations. Under the hood, Venice has a concept of “write compute schemas” which are generated automatically by the system whenever a value schema is registered. Partial update operations are encoded according to these schemas, and the first iteration of the API required users to pass data to Venice using that system-generated schema. This worked, and will continue to be supported, but it was a bit tedious and unproductive, so there are now new APIs which make it easier to perform these operations.</p>
<h3 id="heading-update-builder-api">Update Builder API</h3>
<p>The <a target="_blank" href="https://github.com/linkedin/venice/blob/main/internal/venice-common/src/main/java/com/linkedin/venice/writer/update/UpdateBuilder.java#L24">UpdateBuilder</a> is a Java DSL for declaring operations for each field of interest, including updating the field’s value, and in the case of collection fields, adding or removing elements from them.</p>
<h3 id="heading-incremental-push-update-api">Incremental Push Update API</h3>
<p>For Incremental Push Jobs, the user can now pass as input any valid subset of fields, even if it does not correspond to a previously registered schema, and the input will be converted to partial updates.</p>
<h3 id="heading-online-producer-api">Online Producer API</h3>
<p>The <a target="_blank" href="https://venicedb.org/docs/user_guide/write_api/online_producer">Online Producer</a> is a new client library which provides a producer-style API. The fundamental design of Venice remains unchanged, in that writes are still asynchronous (eventually consistent), even when using this new client API. The main benefit is that it makes it easier to emit writes to Venice from any service, rather than requiring a stream processing application.</p>
<p>The producer API supports all operation types, including put, delete and updates (via the new Update Builder API). In addition, it supports optionally specifying a logical timestamp.</p>
<h2 id="heading-read-apis">Read APIs</h2>
<p>In addition to new write APIs, there has also been innovation in terms of reading data out of Venice.</p>
<p>Note that many of the additions in this section are still considered experimental, as will be described in more details below. Unless indicated otherwise, this means the APIs could change or be removed in the future.</p>
<h3 id="heading-fast-client-api">Fast Client API</h3>
<p>The Fast Client already existed in the previous stable release, but it was scoped down to single get operations only. The single get functionality has been tested at scale for a long time and is now very stable. In addition, the Fast Client has reached functional parity with the Thin Client, now that batch get and read compute operations are supported. The batch get and read compute APIs should still be considered experimental in the sense that they may require further stabilization in the near-term, but they are not at risk of being changed or removed.</p>
<p>Moreover, there is one more experimental client configuration available, which changes the data transport implementation from R2 to gRPC (this also requires configuring the server-side accordingly).</p>
<p>Finally, server-side read quota enforcement is now supported (whereas before it was only supported in the router-side, meaning Fast Client applications were never subject to quota). As such, Fast Client usage can now result in QuotaExceededExceptions (429 status code), which was not the case before. This is an important milestone in the journey towards making Fast Client the default client for remote queries to Venice.</p>
<h3 id="heading-da-vinci-client-api">Da Vinci Client API</h3>
<p>For the Da Vinci Client, one client configuration has been removed, which is the Non-Local Access Policy. Over 4 years of running Da Vinci Client use cases in production, we have not yet seen a scenario where this mode was needed. In addition, we have seen that some users misunderstood the configuration, enabled it, and suffered production outages as a result. For these reasons, we have decided to reduce the scope of functionality.</p>
<p>There are also two new experimental client configurations:</p>
<p>The <a target="_blank" href="https://venicedb.org/docs/user_guide/read_api/da_vinci_client#record-transformer">Da Vinci Record Transformer</a> is a mode where the user can register a callback that will be invoked for every record consumed by Da Vinci. The callback returns a record, which can be either the same one which was passed in or a different one. This can be used to perform client-side filtering or transformation. In the case of transformations, the returned records must all have the same schema (e.g. containing a subset of fields, if the user is interested in projecting, or entirely new fields which are somehow computed from the original ones). It is also possible to use this API as a “black hole”, meaning that it would never return any record for Da Vinci to persist, but still results in some computation or side-effects taking place (e.g. storing data in a different data structure than RocksDB). These computations should be lightweight, otherwise consumption speed will degrade.</p>
<p>The <a target="_blank" href="https://github.com/linkedin/venice/blob/e95a269470cd65a03e6a357a7d4a1c0aa72b2d59/clients/da-vinci-client/src/main/java/com/linkedin/davinci/client/DaVinciConfig.java#L148">Large Batch Get Request Split Threshold</a> is an optimization which enables the client to leverage more threads to perform batch gets faster.</p>
<h3 id="heading-consumer-api">Consumer API</h3>
<p>In addition to the new producer API, Venice also got a new <a target="_blank" href="https://github.com/linkedin/venice/blob/main/clients/da-vinci-client/src/main/java/com/linkedin/davinci/consumer/VeniceChangelogConsumer.java">consumer API</a>, which can be used to build change capture use cases. This one is also experimental and should be treated as a “preview” functionality, which could change or maybe even get removed in the future.</p>
<p>Note that there is some overlap between this consumer API and the aforementioned Da Vinci Record Transformer (if used in the “black hole” pattern). The difference between the two is that the consumer <em>hides</em> full pushes by jumping over automatically to the new dataset version, while the Da Vinci Record Transformer processes full pushes in the same way that Da Vinci usually does (i.e. by loading the future version in the background, and only swapping reads to it after it is sufficiently caught up). If either APIs could do the job, it is recommended to consider using the Da Vinci Record Transformer rather than the Consumer Client.</p>
<h1 id="heading-operational-improvements">Operational Improvements</h1>
<p>As a mature system that has been running in production for more than 7 years, and which continues to see significant year-over-year scale increases, a large fraction of development effort goes into continuous improvement, including stability, performance, tech debt reduction, etc. Although it is hard to do justice to every one of those changes, this section attempts to highlight some of the main themes.</p>
<h2 id="heading-push-job">Push Job</h2>
<p>The Push Job has received a number of investments, detailed below.</p>
<h3 id="heading-ttl-repush">TTL Repush</h3>
<p>Use cases that needed TTL were historically supported by a combination of “empty push” followed by the hybrid store rewind. This worked but was not very efficient, and the cost was especially visible in scenarios with high streaming write throughput. <a target="_blank" href="https://venicedb.org/docs/user_guide/ttl#repush-with-ttl">TTL Repush</a> is a replacement for the previous pattern, enabling more of the work to be offloaded to the grid, where resources are usually cheaper, and less work to be performed on the Venice servers, which typically run on more expensive hardware.</p>
<h3 id="heading-mapreduce-to-spark-migration">MapReduce to Spark Migration</h3>
<p>This is a dependency hygiene initiative, since MapReduce is not as well supported nowadays. It should also make it easier to support additional input types. For now, the Push Job supports both compute engines, but eventually, support for the MapReduce engine will be removed. While the Spark mode is already being used in production and appears to be stable so far, it should be noted that it does not yet achieve performance parity with the MapReduce mode. Performance optimization is still on ongoing effort.</p>
<h3 id="heading-compression-stats-gathering">Compression Stats Gathering</h3>
<p>The Push Job has a new mode where it can perform a compression dry-run on a sample of data for all jobs, even if compression is disabled for that store. The compressibility ratio is then stored in the Push Job Status system store, which can be mined to identify stores offering good compression opportunities.</p>
<h2 id="heading-server-ingestion">Server Ingestion</h2>
<p>A large amount of work has gone into the server’s ingestion code, to make it more modular, performant, observable and predictable.</p>
<h3 id="heading-pub-sub-abstraction">Pub Sub Abstraction</h3>
<p>In addition to new user-facing producer and consumer APIs, under the hood Venice also got a revamped integration to its pub sub layer. This enables plugging in other pub sub systems besides Kafka. For now, an alternative pub sub system must support numeric offsets and log compaction, just like Kafka, though those constraints are likely to get loosened up in the future.</p>
<h3 id="heading-heartbeats">Heartbeats</h3>
<p>The servers now emit a heartbeat control message once per minute per partition for which they are the leader of. This architectural improvement makes it easier to deal with stores which have low or intermittent streaming write traffic. In particular, the time lag metric can now be relied upon to accurately measure end-to-end write latency in all scenarios.</p>
<h3 id="heading-workload-isolation">Workload Isolation</h3>
<p>A new server configuration enables a separate thread pool for the leader’s real-time processing work, which is more expensive as it needs to perform more steps (conflict resolution, partial updates). The rest of the partitions are still processed in the original thread pool. Splitting these two distinct workloads provides more predictable ingestion performance in scenarios where a cluster carries both high throughput streaming writes and full pushes.</p>
<h3 id="heading-ingestion-configuration-deprecations">Ingestion Configuration Deprecations</h3>
<p>In a future release, two server configurations will be deprecated:</p>
<p>Ingestion Isolation is the functionality where a child process would be forked to handle all batch ingestion, while the parent process took care of streaming ingestion and read queries. Although this functionality was sufficiently stable to be used in production, it introduced a lot of complexity and maintenance burden. Furthermore, in-depth benchmarking revealed that it did not bring significant performance gains for the server workloads. For these reasons, it is considered to be tech debt, and removing it will improve maintainability. Note that Ingestion Isolation will only be removed for servers, and will still be available for Da Vinci Clients, since the implementation for that is much simpler, and the applications carrying Da Vinci Clients have much more varied workloads, some of which may still benefit from the isolation provided by a child process.</p>
<p>Amplification Factor is the functionality where a store could be configured such that the partitions subscribed via the Da Vinci API are each backed by multiple sub-partitions. This was intended to provide more scalable throughput while allowing Da Vinci users to interact with the store as if it had a lower partition count. This functionality was stable for batch-only stores, but not for hybrid stores. Fixing the hybrid store support was considered a lot of effort, and in practice there did not seem to be use cases that really needed this. For these reasons, we will remove support for the Amplification Factor store configuration in a future release.</p>
<h1 id="heading-closing-remarks">Closing Remarks</h1>
<p>As promised for stable releases, the Docker images for <strong>0.4.263</strong> have been published to <a target="_blank" href="https://hub.docker.com/u/venicedb">DockerHub</a>.</p>
<p>In the future, we intend to publish stable release details more regularly, so the change log should not be as large going forward.</p>
<p>If you have any questions or comments, please reach out on the <a target="_blank" href="http://slack.venicedb.org">community Slack</a>!</p>
]]></content:encoded></item><item><title><![CDATA[VeniceCon 2024]]></title><description><![CDATA[As announced last week on social media, we are happy to kick off the first-ever VeniceCon!
This in-person event will feature four talks over the course of an afternoon on Tuesday June 25th, 2024:

Overview of Venice and Surrounding AI Ecosystem, by M...]]></description><link>https://blog.venicedb.org/venicecon-2024</link><guid isPermaLink="true">https://blog.venicedb.org/venicecon-2024</guid><category><![CDATA[conference]]></category><category><![CDATA[distributed system]]></category><category><![CDATA[Databases]]></category><category><![CDATA[architecture]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 14 Jun 2024 00:40:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718310438665/10586cc2-e37f-460e-b85c-93e75cdc7df4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As announced last week on <a target="_blank" href="https://www.linkedin.com/feed/update/urn:li:activity:7204923209819856897">social</a> <a target="_blank" href="https://x.com/VeniceDataBase/status/1799157696815600097">media</a>, we are happy to kick off the first-ever <a target="_blank" href="https://www.meetup.com/big-data-meetup-linkedin/events/301509265/">VeniceCon</a>!</p>
<p>This in-person event will feature four talks over the course of an afternoon on Tuesday June 25th, 2024:</p>
<ol>
<li><p>Overview of Venice and Surrounding AI Ecosystem, by <a target="_blank" href="https://www.linkedin.com/in/manu-jose-9aba18b/">Manu Jose</a> and <a target="_blank" href="https://www.linkedin.com/in/zac-policzer-41160157/">Zac Policzer</a></p>
</li>
<li><p>Project Update -- What Venice Shipped in the Last Year, by <a target="_blank" href="https://www.linkedin.com/in/felixgv/">Felix GV</a></p>
</li>
<li><p>How LinkedIn's Trust &amp; Privacy Filtering Were Re-Architected to Leverage Venice &amp; Da Vinci, by <a target="_blank" href="https://www.linkedin.com/in/apurv-kumar-59b24011b/">Apurv Kumar</a></p>
</li>
<li><p>Venice’s Next-Gen Read Path, by <a target="_blank" href="https://www.linkedin.com/in/xun-yin-7a8494b8/">Xun Yin</a></p>
</li>
</ol>
<p>If you are in the Bay Area, come learn about Venice and the use cases it supports by <a target="_blank" href="https://www.meetup.com/big-data-meetup-linkedin/events/301509265/">signing up here</a>!</p>
]]></content:encoded></item><item><title><![CDATA[Stable Releases]]></title><description><![CDATA[As part of our intent to open up the various developmental processes of the Venice project, we are announcing today the publication of our latest stable release, 0.4.85!
This post is not about the details of that specific release, but to shed light o...]]></description><link>https://blog.venicedb.org/stable-releases</link><guid isPermaLink="true">https://blog.venicedb.org/stable-releases</guid><category><![CDATA[release notes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[Docker]]></category><category><![CDATA[venice]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Fri, 23 Jun 2023 19:51:36 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/MEW1f-yu2KI/upload/3ec0a381097337bab664dfce7091e896.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As part of our intent to open up the various developmental processes of the Venice project, we are announcing today the publication of our latest stable release, <a target="_blank" href="https://github.com/linkedin/venice/tree/0.4.85">0.4.85</a>!</p>
<p>This post is not about the details of that specific release, but to shed light on the release process itself, and what it means for us to call a release stable.</p>
<p>In terms of cadence, we typically cut releases about twice a week, but not all of them go sitewide at LinkedIn. Out of the three services, the controllers are deployed most frequently, followed by routers and finally servers. The first two are stateless, which makes them easy to upgrade and roll back quickly, whereas servers are stateful and thus carry more inertia.</p>
<p>Before a release gets deployed sitewide, we go through many steps:</p>
<ol>
<li><p>We deploy to our certification environment, where we run some tests which are more difficult to achieve in the test suite. This includes performance, chaos, longevity and compatibility testing.</p>
</li>
<li><p>If certification is satisfactory, we progress to the staging environment, which is not intended for us to test Venice, but rather for our internal users to test their own applications. Still, we occasionally find issues at this step.</p>
</li>
<li><p>After staging we hit prod, starting with canaries (1 node per cluster) in a single region. We bake the release by performing additional checks (including <a target="_blank" href="https://engineering.linkedin.com/blog/2019/eliminating-toil-with-fully-automated-load-testing">load tests</a>, <a target="_blank" href="https://engineering.linkedin.com/blog/2015/11/monitoring-the-pulse-of-linkedin">EKG</a> and <a target="_blank" href="https://engineering.linkedin.com/blog/2017/02/redliner--how-linkedin-determines-the-capacity-limits-of-its-ser">Dyno</a>) in this environment, to capture the idiosyncrasies of our diversity of workloads. If the canaries are successful, we then roll out to entire clusters, still in just one region. The fully released region bakes some more, and if no issues are discovered, we finally deploy to other regions as well.</p>
</li>
</ol>
<p>If an issue is discovered at any step, a judgment call is made on whether to rollback the release fully, partially or not at all, depending on the scope and severity of the issue. In general, we tend to be fairly strict on release viability, and even an issue as minor as breaking a metric could be sufficient to scuttle a release.</p>
<p>In some cases, we have tactical improvements that apply to specific workloads and are thus released in priority to the affected clusters. Overall, we try to move fast without breaking things. As such, we don't let the main branch get too far ahead of what's in prod, since large changesets make issues harder to debug.</p>
<p>Due to all of the above reasons, we routinely run a mix of release versions, and only occasionally align the whole site on a single version. As a matter of fact, we have already moved beyond this stable release in some parts of the site.</p>
<p>In order to mark a version as a stable release, we’ll use the criteria that it has been successfully rolled out sitewide. This doesn’t mean other versions are bad, but merely that they received a lesser amount of testing at scale.</p>
<p>Needless to say, we encourage new users to stick to the stable releases, though we hope that in time some power users from the open source community will help share the burden of stress testing the bleeding edge releases as well.</p>
<p>Finally, for each stable release, we will regenerate the Docker images on <a target="_blank" href="https://hub.docker.com/u/venicedb">Docker Hub</a>. And starting from the next stable release, we will publish release notes on this blog to highlight some of the major changes since the last stable release.</p>
<p>If you have any questions or feedback, please let us know on the <a target="_blank" href="http://slack.venicedb.org">Venice community Slack</a>!</p>
]]></content:encoded></item><item><title><![CDATA[Public CI]]></title><description><![CDATA[For the past few years, the Venice team at LinkedIn has been maintaining a Jenkins cluster to run builds. This has worked well and it helps improve the team’s productivity, but now that the project is open source, it is preferable to have a publicly ...]]></description><link>https://blog.venicedb.org/public-ci</link><guid isPermaLink="true">https://blog.venicedb.org/public-ci</guid><category><![CDATA[Databases]]></category><category><![CDATA[ci]]></category><category><![CDATA[github-actions]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Wed, 08 Feb 2023 15:28:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/RDqeSz1cM5E/upload/2b2c263a5f6b383d873ed0404fe2095b.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the past few years, the Venice team at LinkedIn has been maintaining a Jenkins cluster to run builds. This has worked well and it helps improve the team’s productivity, but now that the project is open source, it is preferable to have a publicly accessible CI solution. For this, we have chosen GitHub Actions. This is a quick overview of what we have done so far in this space, and what we're hoping to do later.</p>
<p>After <a target="_blank" href="https://www.linkedin.com/in/sushantmane/">Sushant</a> initially <a target="_blank" href="https://github.com/linkedin/venice/pull/115">configured the actions</a> at the end of 2022, the build took over 4 hours of machine time, split across 4 tasks, the longest of which took over 2 hours. This was a degradation compared to the internal CI which could run the whole suite on a single machine in about 1 hour, so the first order of business was to speed up the build.</p>
<p>Historically, we had not been very diligent about what tests went where, so we had integration tests (i.e. anything that uses our <a target="_blank" href="https://github.com/linkedin/venice/blob/main/internal/venice-test-common/src/integrationtest/java/com/linkedin/venice/integration/utils/ServiceFactory.java">ServiceFactory</a>) littered everywhere. We <a target="_blank" href="https://github.com/linkedin/venice/pull/155">consolidated all of them into a single module</a>, which means now every other module is strictly reserved for unit tests. The unit tests take about half an hour to run, so we put those in a single task, and went about splitting the now consolidated integration tests into a bunch of smaller buckets so that they could run in parallel. It is hard to bin pack optimally (and we can still do better in that regard) so the goal was not necessarily to make all buckets take the same amount of time, but merely that no bucket took longer than the unit tests.</p>
<p>In the end, due to limitations in <a target="_blank" href="https://github.com/actions/runner/issues/1182">GitHub's implementation of YAML</a>, we ended up <a target="_blank" href="https://github.com/linkedin/venice/pull/161">dynamically generating the GitHub Actions</a> as part of our Gradle build. There is undoubtedly a better and cleaner way to do this, but for the time being, this works, and it lowers the CI's wall clock time to about half an hour; faster than the internal CI!</p>
<p><a target="_blank" href="https://www.linkedin.com/in/xinchen8/">Adam</a> then added static analysis so that violations of <a target="_blank" href="https://github.com/linkedin/venice/pull/170">Spotbugs rules</a> as well as degradations in <a target="_blank" href="https://venicedb.org/docs/dev_guide/code_coverage_guide">code coverage</a> cause the build to fail and merging to be blocked.</p>
<p>All of this helps us move in the direction of opening up our developmental processes to the community, but for the time being, we will keep running the internal CI as well, as it provides us with a few things which the public one doesn't (yet), including:</p>
<ol>
<li><p>The ability to download the logs of the build (EDIT: <a target="_blank" href="https://github.com/linkedin/venice/issues/178">this is now supported in our GitHub Actions as well</a>!)</p>
</li>
<li><p>Some reports on which tests are most flaky, which we use to drive continuous improvements in test quality.</p>
</li>
</ol>
<p>Besides the test suite, we also have a release certification environment that we use to run other kinds of tests, including performance, longevity and compatibility tests. This is not open source yet as it is tied to certain internal pieces of infrastructure, but we might be able to make a version of it public eventually.</p>
<p>Please let us know if you have any feedback or suggestions, or if you'd like to contribute in any way, whether to the CI or to Venice itself.</p>
]]></content:encoded></item><item><title><![CDATA[Hello World]]></title><description><![CDATA[Welcome to the official blog of the Venice project.
The goal of this blog is to fill in the gaps in and around the other official resources of the project:

The documentation contains information that is intended to be long-lived, reflective of the l...]]></description><link>https://blog.venicedb.org/hello-world</link><guid isPermaLink="true">https://blog.venicedb.org/hello-world</guid><category><![CDATA[AI]]></category><category><![CDATA[big data]]></category><category><![CDATA[database]]></category><dc:creator><![CDATA[Felix GV]]></dc:creator><pubDate>Thu, 26 Jan 2023 20:10:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1674755824751/TH9mgGLAO.webp?auto=compress" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to the official blog of the <a target="_blank" href="https://github.com/linkedin/venice">Venice</a> project.</p>
<p>The goal of this blog is to fill in the gaps in and around the other official resources of the project:</p>
<ul>
<li><p>The <a target="_blank" href="https://venicedb.org">documentation</a> contains information that is intended to be long-lived, reflective of the latest state of the project, and relevant to the community at large</p>
</li>
<li><p>The <a target="_blank" href="https://www.linkedin.com/company/venicedb">LinkedIn page</a> and <a target="_blank" href="http://twitter.com/VeniceDataBase">Twitter handle</a> are to share interesting tidbits and links</p>
</li>
<li><p>The <a target="_blank" href="http://slack.venicedb.org">Slack workspace</a> (archived on <a target="_blank" href="http://linen.venicedb.org">Linen</a>) and <a target="_blank" href="https://www.linkedin.com/groups/14129519/">LinkedIn group</a> are for the community to interact together</p>
</li>
<li><p>The <a target="_blank" href="https://www.youtube.com/@VeniceDB">YouTube channel</a> contains original videos, as well as <a target="_blank" href="https://youtube.com/@VeniceDB/playlists">playlists</a> of other videos published by other channels</p>
</li>
</ul>
<p>In this blog, we aim to share such things as:</p>
<ul>
<li><p>The motivations behind certain functionalities, design choices, or upcoming changes</p>
</li>
<li><p>The Venice use cases built by the community</p>
</li>
<li><p>The tradeoffs between Venice and other similar systems</p>
</li>
<li><p>And general news about the project, releases or process changes</p>
</li>
</ul>
<p>Follow us here on Hashnode, via RSS or on social media to hear about our future posts!</p>
]]></content:encoded></item></channel></rss>