For a long time I have been reluctant to actively contribute to an open source project. I thought it would be rather complicated and demanding – and that I didn't have the knowledge or skills for it or at the very least that they (the project team) weren't waiting for me.
In December 2021, I decided to have a serious input into the Dapr.io project – and now finally to determine how it works and whether it is really that complicated. In this session I want to tell you about my experiences. How Fork, Clone, Branch, Push (and PR) is the rhythm of contributing to an open source project and how you do that (these are all Git actions against GitHub repositories). How to learn how such a project functions and how to connect to it; which tools are needed, which communication channels are used. I tell how the standards of the project – largely automatically enforced – help me to become a better software engineer, with an eye for readability and testability of the code.
How the review process is quite exciting once you have offered your contribution. And how the final "merge to master" of my contribution and then the actual release (Dapr 1.6 contains my first contribution) are nice milestones.
I hope to motivate participants in this session to also take the step yourself and contribute to an open source project in the form of issues or samples, documentation or code. It's valuable to the community and the specific project and I think it's definitely a valuable experience for the "contributer". I looked up to it and now that I've done it gives me confidence – and it tastes like more (I could still use some help with the work on Dapr.io, by the way).
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
How and Why you can and should Participate in Open Source Projects (AMIS, Software Engineering SIG, February 2022)
1. Lucas Jellema
Architect & CTO AMIS | Conclusion
How and Why
you can and
should
contribute to an
open source
project?!
2. Publiek
Well known Open Source Products
Linux
Apache Http
Server
Apache
Tomcat
Apache
Struts
Hibernate
MySQL GlassFish Ant Maven
Hudson
Jenkins
JUnit
Spring
Framework
Log4J Wordpress Kubernetes
Apache
Kafka
Apache
Spark
VS Code Eclipse Ubuntu
Azure
Functions
Firefox Magento Diagrams.net OpenOffice
How and Why participate in an Open Source Project
I am
because
we are
3. Publiek
Quiz
• How many open source products did you inspect the source of?
• For how many open source products did you change code?
• and submitted it?
• For how many did you:
• file issues & enhancement requests
• contribute to documentation
• submitted examples or test cases
• About how many did you
• present
• blog
• Tweet?
• How many open source products did you make use of?
• today?
• this month?
• in your professional career
How and Why participate in an Open Source Project
4. Publiek
Open Source code analyzed and contributed
How and Why participate in an Open Source Project
6. Publiek
Number of open source products used in your career
How and Why participate in an Open Source Project
7. Publiek
Why Participate?
• To give back/make a contribution (“moral debt”)
• Make the product better
• Influence the product
• Plug your own product
• Help grow and spread, thrive and persist
• Learn about and understand the product (technically and strategically)
• To increase your own personal status
• For fun, thrill
• Meet new people, belong to a team
• Grow as a software engineer
• learn from process, tooling, communication
• learn from studying examples and emulating them
• learn from review feedback and interaction
How and Why participate in an Open Source Project
8. Publiek
Why not?
• I think lack the skills to be of value
• Scary to be exposed to public scrutiny
• Don’t know how to
• I do not really care
• I have a day job
• I do not particularly like IT
• I have other things to do
How and Why participate in an Open Source Project
10. Publiek
Terms to come to grips with
LGTM
PR
Clone
Fork
Merge
Push
Pull
Origin
Commit (verb & noun)
Branch
Milestone
Issue
upstream
repository
How and Why participate in an Open Source Project
review
alpha
beta
stable
Git
GitHub
GitHub Action
GitHub Code Space
Dev Container
Markdown
Founder
Maintainer
Committer
Author
Contributor
unit test
conformance test
end 2 end test
integration test
Hugo
Go
Go Mod Tidy
Go Lint
Go Test
fumpt
11. Publiek
Types of Open Source Projects
How and Why participate in an Open Source Project
Code dumped by commercial vendor
One person effort go-ora
Project with wonderful past but
bleak future
Apache Struts, Apache MyFaces, Apache
Xalan, Apache Ant
Closely controlled by and mixed up
with a single commercial entity
Elastic Stack, OpenShift, VirtualBox, VS Code,
MySQL
Strategic support [and interest] from
multiple commercial vendors
OpenJDK, Kubernetes, Apache Spark
Unaffiliated project with large
committer community
Python, Linux, NodeJS
13. Publiek
Assess status of an Open Source Project
• # issues (open and closed) (bug reports, enhancement requests)
• # pull requests (open and closed) – these constitute the actual evolution of the product
(although the number does not prove the value and scope of the changes)
• # authors (how many different contributors have made a substantial contribution)
• who is using the product/who have dependencies and direct stakes?
• for example (large) commercial players? other (big) open source products?
• # forks (how many times have the repositories been forked
• this would be done for local experimentation and customizations and for making contributions
• release history (frequency of new releases and delta between releases)
• # commits (individual code changes
• # stars (how many "likes" have been awarded by the community)
• # threads on StackOverflow (recently); Google Trends - # recent searches
• visibility through presentations on conferences, articles on Medium, tweets
• activity on the community discussion forum (such as Slack or Discord); #members, #threads,
#messages in recent times
• # different people participating in issues and PRs
• immerse oneself in a project for a few weeks
How and Why participate in an Open Source Project
14. Publiek
Dapr
• Runtime
• Personal Assistant for Applications
• Distributed Application Runtime
• Microservice architecture
• Decoupling
Code Café Speed Dating - December 2021 14
15. Publiek
Dapr.io
• Launched by Microsoft (2019)
• Application runtime framework –
supporting cloud native and serverless
• Every application gets a uniform Personal Assistant
that takes care of common tasks
• remember (take note and reproduce)
• keep log
• restrict access
• handle incoming
• route outgoing
• interact with
other PAs
Code Café Speed Dating - December 2021 15
Application
Microservice or
Monolith
Personal
Assistant
(Dapr)
Personal
Assistant
(Dapr)
Personal
Assistant
(Dapr)
Personal
Assistant
(Dapr)
Personal
Assistant
(Dapr)
Personal
Assistant
(Dapr)
16. Publiek
Dapr.io
• Personal Assistant is Dapr Side Car
• companion process or side car container in Kubernetes Pod
• Out of the Box
support for
• local products &
cloud services
• Kafka, AWS SQS
Azure Event Hub,
GCP Pub/Sub,
RabbitMQ
• DynamoDB, RDS,
CosmosDB,
PostgreSQL,
Redis, MySQL,
MongoDB,
Zookeeper
• SMTP, Twillio,
Twitter, Consul
Code Café Speed Dating - December 2021 16
= Custom Application
17. Publiek
Dapr Statestores
• No Oracle anywhere in Dapr
• Introducing Oracle based components has value
• for Dapr
• for Oracle
• for me (to use Dapr in Oracle context)
• And: I can bring value as bridge between Dapr, microservices & Oracle & OCI
• at last my chance to contribute to OSS!
• One little obstacle: Dapr is Go – I do not know Go.
• My Objective: contribute Dapr State Store component for OCI Object Storage
• and subsequently Oracle Database/ATP, OCI Streaming, Oracle NoSQL, …
• how to go get going?
How and Why participate in an Open Source Project
18. Publiek
Observability
Prometheus AppInsights Jaeger
Zipkin
Bindings
& Triggers
State
Stores
Secret
Stores
PubSub
Brokers
Dapr Architecture
How and Why participate in an Open Source Project
Dapr main
state store
interface
pub/sub
interface
binding
interface
secret
interface
register all
components
(per type)
observable
interface
do something for me – store
or retrieve state, subscribe
to topic (and callback with
messages), invoke service,
retrieve secret
components.yaml
19. Publiek
How to contribute to Dapr.io?
• Analyze Dapr.io website & GitHub
• Repositories, subprojects
• Discord community communication platform
• Developer instructions
• process & tooling
• technical docs?
• existing code & tests
• PRs and review conversations
• submission steps
How and Why participate in an Open Source Project
21. Publiek
How and Why participate in an Open Source Project
project X repo
lucasjellema/
project X
fork
1
my laptop
2
local-dev/
project X
branch
3
Create Docs,
Code, Example, Test
4
Commit Changes
5
push
6
c
l
o
n
e
PR
7
my-contribution-branch
my-contribution
-branch
Fork-Clone-Branch-Code-Commit-Push-PR
Milestone
8
my GitHub account
22. Publiek
How and Why participate in an Open Source Project
dapr/
components-contrib
Issue: Proposal
1
lucasjellema/
components-contrib
fork
2
my laptop
3
dapr-dev/
components-contrib
branch
4
Create Test & Code
5
Commit Changes
(with sign-off)
6
push
7
dapr/
docs
Issue: Proposal
9
c
l
o
n
e
PR
8
oci-objectstorage-state
oci-objectstorage
-state
Milestone
10
24. Publiek
My Contribution: a new State Store component based on
Oracle Cloud Object Storage Service
• State is stored as object in a special bucket on OCI Object Storage
How and Why participate in an Open Source Project
Object
Storage
Custom
State Store
Component
OCI Object
Storage
set & get state
components.yaml components.yaml
set & get state
25. Publiek
Create Issue to Propose Change
How and Why participate in an Open Source Project
https://github.com/dapr/components-contrib/issues/1400
27. Publiek
Fork Repository
How and Why participate in an Open Source Project
dapr/
components-contrib
lucasjellema/
components-contrib
fork
28. Publiek
Repository Fork in my GitHub account
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
29. Publiek
Set up local environment
• WSL2 + Ubuntu
• Go Runtime
• VS Code with Go extensions
• Clone Repository Fork
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
my laptop
dapr-dev/
components-contrib
c
l
o
n
e
31. Publiek
Create branch to develop on
How and Why participate in an Open Source Project
my laptop
dapr-dev/
components-contrib
branch
Create Code Commit Changes
(with sign-off)
oci-objectstorage-state
33. Publiek
Create Test, Create Code
• Two levels of testing
• Unit Testing (with Mock OCI interactor)
• Integration Testing (actually talking to OCI environment)
How and Why participate in an Open Source Project
34. Publiek
Code Formatting and Linting
• Apply formatting rules for uniform code layout
• [also] to facilitate compare and merge
• Check Code Quality against rules
• formatting, commenting, complexity of functions, variable naming,
(un)reachable code
How and Why participate in an Open Source Project
35. Publiek
Add, Commit, Push
• Add changed files to change set
• Commit change set
• with Sign Off in message
• Push Changes - to Repository Fork
on GitHub
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
dapr-dev/
components-contrib
Create Test & Code Commit Changes
(with sign-off)
push
c
l
o
n
e
oci-objectstorage-state
oci-objectstorage
-state
36. Publiek
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
dapr-dev/
components-contrib
Create Test & Code Commit Changes
(with sign-off)
push
c
l
o
n
e
oci-objectstorage-state
oci-objectstorage
-state
37. Publiek
How and Why participate in an Open Source Project
Changes have landed in GitHub – branch in forked repo
38. Publiek
Next: the big PR!
How and Why participate in an Open Source Project
fork
push
c
l
o
n
e
PR
my-contribution
-branch
my GitHub account
lucasjellema/
components-contrib
dapr/
components-contrib
54. Publiek
Extend Documentation
• Issue – link to component issue
• Fork dapr/docs repository
• Clone
• Install Hugo Server
• Create Branch
• Make changes, commit, push
• Create PR
How and Why participate in an Open Source Project
dapr/
docs
Issue: Proposal
PR
55. Publiek
How and Why participate in an Open Source Project
dapr/
components-contrib
Issue: Proposal
1
lucasjellema/
components-contrib
fork
2
my laptop
3
dapr-dev/
components-contrib
branch
4
Create Test & Code
5
Commit Changes
(with sign-off)
6
push
7
dapr/
docs
Issue: Proposal
9
c
l
o
n
e
PR
8
oci-objectstorage-state
oci-objectstorage
-state
Milestone 1.6
10
56. Publiek
Done?
• Yes
• Now wait for milestone 1.6 to be released
How and Why participate in an Open Source Project
57. Publiek
Dapr 1.6 Release Day – January 25, 2022
How and Why participate in an Open Source Project
61. Publiek
The Effort of Setting up and
Running an Open Source Project
• Vision, High level design, architecture, roadmap, license
• Attract, organize, facilitate a contributor community
• Guidelines, Developer How-Tos, DevContainer
• Code of Conduct
• Community Communication – Discord, Slack
• Manage people (egos, ambitions, emotions, opinions)
• Involve vendors
• Design and Implement structure and automated processes for software engineering
• GitHub Set Up – Repositories, Issues, branching strategy
• Automated Code Quality checks and End to End tests – GitHub Actions
• Active management of Issues, Pull Requests, Tags (milestones), Dependencies
• Release process and mechanism
• Attract and Foster the User Community
• Quality & Documentation (activity, bugfixing)
• Website
• Content
• “noise/buzz”
• Provide support to users
• Build relations (vendors, other projects, VIPs, analysts)
How and Why participate in an Open Source Project
62. Publiek
Dapr.io has dozens of committers,
100s of contributors
How and Why participate in an Open Source Project
64. Publiek
On the essence of automation, human attention and civil
conversation
How and Why participate in an Open Source Project
65. Publiek
On the essence of automation, human attention and civil
conversation (part 2)
How and Why participate in an Open Source Project
66. Publiek
What happened since 25th January?
• Improvements in OCI Object Storage
state store component
• Introduced new Oracle Database state
store component
• inspired by the existing PostgreSQL
state store component
• small contribution to sijms/go-ora
project (Go driver for Oracle Database)
How and Why participate in an Open Source Project
68. Publiek
PR was merged on February 8th
How and Why participate in an Open Source Project
69. Publiek
Personal Findings
• Learning experience
• I can play at this level
• Join, participate, contribute
• Patience (time zones and more)
• Complexity of managing an open source
project
• fragility
How and Why participate in an Open Source Project
70. Live Open Source Contribution
Flashback History
in Oracle Database State Store
How and Why participate in an Open Source Project
71. Publiek
Live Open Source Coding:
Let’s enrich the Oracle Database State Store Component
• Idea
• Issue – Feature Proposal
• Issue – Documentation modification
• (Fetch Upstream, Pull latest)
• Create Test
• Create Code (run test, run lint)
• (Fetch Upstream, Pull latest)
• Create Branch
• Commit changes
• Push
• Create Pull Request
• wait for automated checks to give initial verdict
• (refine based on failed checks, commit, push)
• wait for human reviewers to give feedback
How and Why participate in an Open Source Project
72. Publiek
Idea: Flashback Feature - hints to retrieve historical state
• Allow the use of “flashback hints” in the metadata sent in Get requests; these hints
instruct the state store to return for a specific key
• previous generations or versions of a state element
• the state as it existed X seconds ago
• the state as it existed at a specific timestamp in the past
possibly even return the state from before it expired or was deleted
• The response will provide metadata to indicate
• what generation of the state is returned
(current, previous, one before previous)
• when the state returned was created and when it ceased to exist
• if the element state element for this key no longer exists (expired or deleted)
• If the requested history cannot be returned, no data is returned (and no error)
How and Why participate in an Open Source Project
73. Publiek
Idea: flashback– hints in get-requests
• Proposed Metadata in Get requests
• flashback-generation – values 0 (for current value), -1 (for previous value), -2
(for the one but previous value), -3...-X – to ask for a specific generation of
the state under the specified key
• flashback-atTime – a UTC timestamp in the past - to ask for the value of the
state under the specified key at a specific moment in the past
• flashback- age– a positive integer - to ask for the value of the state under the
specified key at the specified number seconds ago
• flashback-allow-deleted – true or false – to indicate whether a value should
be returned if the key currently is deleted or expired from the state store
How and Why participate in an Open Source Project
74. Publiek
Idea: flashback– metadata in get-responses
• Proposed Metadata in Get responses
• flashback-generation – values 0 (for current value), -1 (for previous
value), -2 (for the one but previous value), -3...-X – to indicate the specific
generation of the state returned in the response
• flashback-startTime – a UTC timestamp in the past – to indicate the time
at which the state that is returned was created
• flashback-endTime – a UTC timestamp in the past – to indicate the time at
which the state that is returned was updated, deleted or expired
• flashback-deleted – true or false – to indicate whether the key is deleted
or expired from the state store at the present moment
How and Why participate in an Open Source Project
75. Publiek
Issue – Feature Proposal
How and Why participate in an Open Source Project
dapr/
components-contrib
Issue: Proposal
10
issue
77. Publiek
(Fetch Upstream, Pull latest)
• To start from the latest code on the master branch
• and prevent ugly merge operations later on
• Fetch Upstream – to get current latest from Upstream repo to my Fork
• In my Local Environment – pull to get the latest commit
How and Why participate in an Open Source Project
dapr/
components-contrib
lucasjellema/
components-contrib
fetch
upstream
my laptop
dapr-dev/
components-contrib
p
u
l
l
10
78. Publiek
Create Test – Unit Test
Label Actions *) Outcome
flashback-generation is 0 or negative
integer
get – flashback-generation:24 error (incorrect value - positive integer
- for flashback-generation)
flashback-age is zero or positive
number
get – flashback-age:-3 error (incorrect value - negative value -
for flashback-age)
flashback-atTime is valid timestamp get – flashback-atTime:3 error (incorrect value – not a valid
timestamp - for flashback-atTime)
flashback-atTime is valid timestamp in
the past
get – flashback-atTime:2050-01-
31T23:59:59
error (incorrect value – future
timestamp - for flashback-atTime)
flashback-atTime is valid timestamp in
the past after 10th November 2009 at
23:00 UTC
get – flashback-atTime:2009-11-
10T22:0:0
error (incorrect value – too old
timestamp - for flashback-atTime)
flashback-generation is 0 or negative
integer
get – flashback-generation:XYZ error (incorrect value – not a number -
for flashback-generation)
flashback-age and flashback-atTime
are both set
get – flashback-age:50, flashback-
atTime:2009-11-10T22:0:0
error (only one flashback metadata
can be set – to prevent conflicts)
How and Why participate in an Open Source Project
*) a random key is generated for each test and used for all get, set and delete operations
79. Publiek
Create Test –Integration Test
Label Actions *) Outcome
Not found returned for non
existing generation
set, get – flashback-generation:-1 not found
Value returned for existing
generation
set, get – flashback-generation:0 value returned
Value returned for existing
generation
set, set, get – flashback-generation:-1 first (previous) value returned
Original value returned after
delete
set, delete, get – flashback-generation:-1; flashback-allow-
deleted: true
value returned + flashback-
deleted meta data
Older generation value returned set, set, set, set, get – flashback-generation:-3 first value returned
Value from past timestamp set, wait one second, set, set, get – flashback-age:-0.5 first value returned
Value from before first
timestamp cannot be found
set, wait one second, set, set, get – flashback-age:-2.5 not found
Value from past timestamp set, <time>, wait one second, set, set, get – flashback-
asOf:<time>
first value returned
Value from before first
timestamp cannot be found
<time>, wait, set, set, set, get – flashback-asOf:<time> not found error
How and Why participate in an Open Source Project
*) a random key is generated for each test and used for all get, set and delete operations
80. Publiek
Run Test
• Add flashback test-cases to unit test and integration test
• Without having touched the state store component’s code – run the test
• the run should be successful – but [most] new tests will fail
• our objective is clear: change the code to make all tests succeed
How and Why participate in an Open Source Project
my laptop
dapr-dev/
components-contrib
add test
cases
81. Publiek
Create Code – Run Test – Run Lint
• Implement the desired functionality
• by making all tests succeed
• Run gofumpt and lint to prepare code for automated checks that will run
when the PR is submitted
• fix relevant rule violations
How and Why participate in an Open Source Project
my laptop
dapr-dev/
components-contrib
add code implementing
features & satisfying test cases
82. Publiek
Create Branch, Commit Changes, Push
• Create a new branch flashback-in-oracle-database-state-store based on master
• Switch to branch
• Add changes and commit [with sign-off]
• Push (publish branch to repository fork on GitHub, include local commits)
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
my laptop
dapr-dev/
components-contrib
branch
Commit Changes
(with sign-off)
push
flashback-in-oracle-
database-state-store
flashback-in-oracle-
database-state-store
83. Publiek
Create Pull Request
• Create PR for feature branch to upstream master – with link to issue
• wait for automated checks to give initial verdict
• refine based on failed checks, commit modifications, push to add to PR
• wait for human reviewers to give feedback
How and Why participate in an Open Source Project
lucasjellema/
components-contrib
my laptop
dapr-dev/
components-contrib
flashback-in-oracle-
database-state-store
flashback-in-oracle-
database-state-store
dapr/
components-contrib
PR
issue
84. Publiek
Create – Commit – Branch - Push – PR Documentation
• Produce the documentation that describe the new behavior of the Oracle
Database state store component
• Commit on a feature branch
• Push branch and changes to docs repository fork
• Create a PR to merge to the 1.8 documentation branch
How and Why participate in an Open Source Project
lucasjellema/
docs
Branch, Commit, Push
dapr/
docs
PR
85. Publiek
Uitnodiging
• Heb jij zin om mee te werken aan Dapr componenten?
How and Why participate in an Open Source Project
dapr/
components-contrib
AMIS-services/
components-contrib
fork
c
l
o
n
e
c
l
o
n
e
feature
branch
c
l
o
n
e
86. Publiek
Uitnodiging
• Heb jij zin om mee te werken aan Dapr componenten?
How and Why participate in an Open Source Project
dapr/
components-contrib
AMIS-services/
components-contrib
fork
c
l
o
n
e
c
l
o
n
e
PR
pull, commit,
push
feature
branch
feature dev
branch
pull, commit,
push
c
l
o
n
e
PR
88. Publiek
X
How and Why participate in an Open Source Project
dapr/
components-contrib
Issue: Proposal
1
lucasjellema/
components-contrib
fork
2
my laptop
3
dapr-dev/
components-contrib
branch
4
Create Code
5
Commit Changes
(with sign-off)
6
push
7
dapr/
docs
Issue: Proposal
9
c
l
o
n
e
PR
8
oci-objectstorage-state
oci-objectstorage
-state
Milestone
10
89. Publiek
Brief introduction on Open Source Projects
• types
• organization
• roles
• process
• tools/infra (GitHub)
• aliveness (see Yammer thread)
How and Why participate in an Open Source Project
Editor's Notes
URLs to share:
The Dapr.io open source project
https://dapr.io/
The Dapr.io Components GitHub Repo
https://github.com/dapr/components-contrib
Dapr.io Docs on State Store Components:
https://docs.dapr.io/reference/components-reference/supported-state-stores/#oracle-cloud-infrastructure-oci
And Dapr.io Docs Preview 1.7 (with OCI Autonomous Database and Oracle Database):
https://v1-7.docs.dapr.io/reference/components-reference/supported-state-stores/#oracle-cloud-infrastructure-oci
Dapr Discord
https://discord.com/invite/ptHhX6jc34
The Medium article on my open source contribution:
https://medium.com/@lucasjellema/submitting-my-custom-dapr-state-component-as-a-formal-open-source-contribution-work-in-progress-a8bd3fc1ece4
https://en.wikipedia.org/wiki/Ubuntu
Ubuntu is named after the Nguni philosophy of ubuntu, which Canonical indicates means "humanity to others" with a connotation of "I am what I am because of who we all are".[7]
Allow retrieval of past generations of historical state from Oracle Database State Store
<!-- If you need to report a security issue please visit https://docs.dapr.io/operations/support/support-security-issues -->
## Describe the feature
<!-- Please also discuss possible business value -->
Through the use of a few metadata parameters in requests to get data from the state store, users of the Oracle Database State Store are able to indicate they want to retrieve state from the past, instead of the current state. They can for example ask for a specific generation (similar to HEAD~2 or HEAD~5 instruction in Git) such as the previous state or the state from five generations ago. Users can also ask for the state at a specific timestamp or the state as it existed the indicated number of seconds ago.
Proposed metadata parameters:
* _flashback-generation_ – values 0 (for current value), -1 (for previous value), -2 (for the one but previous value), -3...-X – to ask for a specific generation of the state under the specified key
* _flashback-atTime_ – a UTC timestamp in the past - to ask for the value of the state under the specified key at a specific moment in the past
* _flashback-age_– a positive integer - to ask for the value of the state under the specified key at the specified number seconds ago
* _flashback-allow-deleted_ – true or false – to indicate whether a value should be returned if the key currently is deleted or expired from the state store
When the state did not exist at the specified point in time (or generation) or is no longer available from the state store's flashback mechanism, the response is empty (no error) just in the case of a request for state under a key that does not occur.
The response will include the following meta data parameter when the returned historical state corresponds to a state record that is in the present expired or deleted:
* _flashback-deleted_ – true or false – to indicate whether the key is deleted or expired from the state store at the present moment
The proposed feature leverages the Oracle Database mechanisms of Flashback Query and Flashback Versions Query. No additional setup of the database is required.
This feature allows applications to track changes to a specific state element in time - and to construct a consistent picture of the world by getting all state for a specific moment in time. The retrieval of past generations can be used to resolve issues around state changes from different sources - especially when a LAST WRITE policy was used. And the feature makes it possible to rollback changes and even recover from delete and expire operations.
## Release Note
<!-- How should this new feature be announced in our release notes? It can be populated later. -->
<!-- Keep it as a single line. Examples: -->
<!-- RELEASE NOTE: **ADD** New feature in Dapr. -->
<!-- RELEASE NOTE: **FIX** Bug in runtime. -->
<!-- RELEASE NOTE: **UPDATE** Runtime dependency. -->
RELEASE NOTE: **ADD** Retrieval of historic state from Oracle Database state store (using metadata parameters in get state requests)
Describe new feature in Oracle Database State Store for retrieval of historical state
**What content needs to be created or modified?**
<!--A clear and concise description of what the problem is. Ex. There should be docs on how pub/sub works...-->
The docs for state store component based on Oracle Database should describe the functionality that allows retrieval of historic and deleted/expired state.
**Describe the solution you'd like**
<!--A clear and concise description of what you want to happen-->
The page describing the state store component for Oracle Database must be complemented with the description of retrieving historic state in get requests.
**Where should the new material be placed?**
<!--Please suggest where in the docs structure the new content should be created-->
Changes are needed (only) in this page daprdocs/content/en/reference/components-reference/supported-state-stores/setup-oracledatabase.md
**The associated pull request from dapr/dapr, dapr/components-contrib, or other Dapr code repos**
<!--
Specify the URL to the associated pull request, if applicable
For example: https://github.com/dapr/dapr/pull/3277
-->
**Additional context**
<!--Add any other context or screenshots about the feature request here-->
Allow retrieval of past generations of historical state from Oracle Database State Store
# Description
Changes in Get request flow against the Oracle Database state store component:
* four new metadata parameters are supported - to control the potential retrieval of historic and even deleted or expired state
* extended unit test to validate the behavior that checks these parameters for acceptable values
* extended integration test to validate the intended behavior based on the flashback metadata parameters
* modified state store implementation for Oracle Database to provide the flashback behavior specified through the parameters when executing get requests
Note: no impact on any of the functionality outside get-ting state from this state store.
Through the use of a few metadata parameters in requests to get data from the state store, users of the Oracle Database State Store are able to indicate they want to retrieve state from the past, instead of the current state. They can for example ask for a specific generation (similar to HEAD~2 or HEAD~5 instruction in Git) such as the previous state or the state from five generations ago. Users can also ask for the state at a specific timestamp or the state as it existed the indicated number of seconds ago.
Supported metadata parameters:
* _flashback-generation_ – values 0 (for current value), -1 (for previous value), -2 (for the one but previous value), -3...-X – to ask for a specific generation of the state under the specified key
* _flashback-atTime_ – a UTC timestamp in the past - to ask for the value of the state under the specified key at a specific moment in the past
* _flashback-age_– a positive integer - to ask for the value of the state under the specified key at the specified number seconds ago
* _flashback-allow-deleted_ – true or false – to indicate whether a value should be returned if the key currently is deleted or expired from the state store
When the state did not exist at the specified point in time (or generation) or is no longer available from the state store's flashback mechanism, the response is empty (no error) just in the case of a request for state under a key that does not occur.
The response to a get request includes the following meta data parameter when the returned historical state corresponds to a state record that is in the present expired or deleted:
* _flashback-deleted_ – true or false – to indicate whether the key is deleted or expired from the state store at the present moment
The implementation leverages the Oracle Database mechanisms of Flashback Query and Flashback Versions Query. No additional setup of the database is required.
## Issue reference
We strive to have all PR being opened based on an issue, where the problem or feature have been discussed prior to implementation.
Please reference the issue this PR will close: #_[issue number]_
## Checklist
Please make sure you've completed the relevant tasks for this PR, out of the following list:
* [X] Code compiles correctly
* [X] Created/updated tests
* [ ] Extended the documentation / Created issue in the https://github.com/dapr/docs/ repo: dapr/docs#_[issue number]_