Skip to content

Commit 54429c3

Browse files
authored
Merge pull request #289 from bitfield-co/283-eventstoreappend_to_stream-is-not-able-to-append-more-than-1000-events-to-a-new-stream
Remember the generated stream_id across batches of events being appeneded.
2 parents 5e17ea1 + 0956c4c commit 54429c3

File tree

5 files changed

+56
-43
lines changed

5 files changed

+56
-43
lines changed

lib/event_store/sql/statements/insert_events.sql.eex

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,24 @@ WITH
5757
SET stream_version = stream_version + $2::bigint
5858
WHERE stream_id = 0
5959
RETURNING stream_version - $2::bigint as initial_stream_version
60+
),
61+
linked_stream_events AS (
62+
INSERT INTO "<%= schema %>".stream_events
63+
(
64+
event_id,
65+
stream_id,
66+
stream_version,
67+
original_stream_id,
68+
original_stream_version
69+
)
70+
SELECT
71+
new_events_indexes.event_id,
72+
0,
73+
linked_stream.initial_stream_version + new_events_indexes.index,
74+
stream.stream_id,
75+
new_events_indexes.stream_version
76+
FROM
77+
new_events_indexes, linked_stream, stream
6078
)
61-
INSERT INTO "<%= schema %>".stream_events
62-
(
63-
event_id,
64-
stream_id,
65-
stream_version,
66-
original_stream_id,
67-
original_stream_version
68-
)
69-
SELECT
70-
new_events_indexes.event_id,
71-
0,
72-
linked_stream.initial_stream_version + new_events_indexes.index,
73-
stream.stream_id,
74-
new_events_indexes.stream_version
75-
FROM
76-
new_events_indexes, linked_stream, stream;
79+
80+
SELECT stream_id from stream;

lib/event_store/sql/statements/insert_events_any_version.sql.eex

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,24 @@ WITH
5757
SET stream_version = stream_version + $2::bigint
5858
WHERE stream_id = 0
5959
RETURNING stream_version - $2::bigint as initial_stream_version
60+
),
61+
linked_stream_events AS (
62+
INSERT INTO "<%= schema %>".stream_events
63+
(
64+
event_id,
65+
stream_id,
66+
stream_version,
67+
original_stream_id,
68+
original_stream_version
69+
)
70+
SELECT
71+
new_events_indexes.event_id,
72+
0,
73+
linked_stream.initial_stream_version + new_events_indexes.index,
74+
stream.stream_id,
75+
stream.initial_stream_version + new_events_indexes.index
76+
FROM
77+
new_events_indexes, linked_stream, stream
6078
)
61-
INSERT INTO "<%= schema %>".stream_events
62-
(
63-
event_id,
64-
stream_id,
65-
stream_version,
66-
original_stream_id,
67-
original_stream_version
68-
)
69-
SELECT
70-
new_events_indexes.event_id,
71-
0,
72-
linked_stream.initial_stream_version + new_events_indexes.index,
73-
stream.stream_id,
74-
stream.initial_stream_version + new_events_indexes.index
75-
FROM
76-
new_events_indexes, linked_stream, stream;
79+
80+
SELECT stream_id from stream;

lib/event_store/storage/appender.ex

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,19 @@ defmodule EventStore.Storage.Appender do
2020
events
2121
|> Stream.map(&encode_uuids/1)
2222
|> Stream.chunk_every(1_000)
23-
|> Enum.each(fn batch ->
23+
|> Enum.reduce(stream_id, fn batch, stream_id ->
2424
event_count = length(batch)
2525

26-
with :ok <- insert_event_batch(conn, stream_id, stream_uuid, batch, event_count, opts) do
26+
with {:ok, new_stream_id} <-
27+
insert_event_batch(conn, stream_id, stream_uuid, batch, event_count, opts) do
2728
Logger.debug("Appended #{event_count} event(s) to stream #{inspect(stream_uuid)}")
28-
29-
:ok
29+
new_stream_id
3030
else
3131
{:error, error} -> throw({:error, error})
3232
end
3333
end)
34+
35+
:ok
3436
catch
3537
{:error, error} = reply ->
3638
Logger.warning(
@@ -110,9 +112,14 @@ defmodule EventStore.Storage.Appender do
110112
params = [stream_id_or_uuid, event_count] ++ build_insert_parameters(events)
111113

112114
case Postgrex.query(conn, statement, params, opts) do
113-
{:ok, %Postgrex.Result{num_rows: 0}} -> {:error, :not_found}
114-
{:ok, %Postgrex.Result{}} -> :ok
115-
{:error, error} -> handle_error(error)
115+
{:ok, %Postgrex.Result{num_rows: 0}} ->
116+
{:error, :not_found}
117+
118+
{:ok, %Postgrex.Result{rows: [[stream_id]]}} ->
119+
{:ok, stream_id}
120+
121+
{:error, error} ->
122+
handle_error(error)
116123
end
117124
end
118125

lib/event_store/streams/stream.ex

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,7 @@ defmodule EventStore.Streams.Stream do
344344

345345
append_to_stream(conn, stream_uuid, expected_version, events, opts)
346346
else
347-
# We should never get here, but just in case we break something in another
348-
# part of the app, this will give us better output in the tests.
349-
{:error, :already_retried_once}
347+
{:error, {:already_retried_once, :duplicate_stream_uuid}}
350348
end
351349
end
352350

test/test_helper.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
exclude = [:ignore, :manual, :migration, :slow]
1+
exclude = [:ignore, :manual, :migration]
22

33
ExUnit.start(exclude: exclude)

0 commit comments

Comments
 (0)