A retried `upsert` inserts a key that a concurrent writer already inserted
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 54/100
Piste de recherche
Start by tracing the upsert commit retry and _FastAppendFiles._validate_concurrency; the issue says that path currently fails to detect a concurrent insert. Reproduce the two-writer example with the supplied SQLite catalog and PyArrow table, then compare the behavior with version 0.11.1. Done means a retry does not leave duplicate keys, and concurrent add_files does not register the same file twice.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Apache Iceberg version
0.12.0 (latest release)
Please describe the bug 🐞
Currently, a commit retry replays the upsert's append, and _FastAppendFiles._validate_concurrency checks nothing, so a key another writer inserted after the read is inserted a second time. 0.11.1 raises CommitFailedException here.
import tempfile
import pyarrow as pa
from pyiceberg.catalog.sql import SqlCatalog
from pyiceberg.schema import Schema
from pyiceberg.types import LongType, NestedField, StringType
cat = SqlCatalog("c", uri="sqlite:///:memory:", warehouse=f"file://{tempfile.mkdtemp()}")
cat.create_namespace("ns")
schema = Schema(NestedField(1, "k", LongType(), required=True), NestedField(2, "v", StringType()), identifier_field_ids=[1])
t = cat.create_table("ns.t", schema=schema)
row = lambda k, v: pa.Table.from_pylist([{"k": k, "v": v}], schema=schema.as_arrow())
t.append(row(1, "a"))
a = cat.load_table("ns.t")
b = cat.load_table("ns.t")
b.upsert(row(2, "b"))
a.upsert(row(2, "a"))
# Commit failed due to a concurrent update, retrying (1/4) in 106 ms
print(sorted(cat.load_table("ns.t").scan().to_arrow().to_pylist(), key=str))
# [{'k': 1, 'v': 'a'}, {'k': 2, 'v': 'a'}, {'k': 2, 'v': 'b'}], should hold k 2 once
Two writers calling add_files on the same file register it twice the same way, and every row in it reads back twice.
tested on pyiceberg 0.12.0 and main
Willingness to contribute
- I can contribute a fix for this bug independently
- I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- I cannot contribute a fix for this bug at this time
- Langage dominant
- Python
- Étoiles
- 1.2k
- Forks
- 654
- Merge moyen
- 2 j 11 h
- PR mergées (30 j)
- 122
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Aucun guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/iceberg-python
-
`inspect.files()` and the other file metadata tables raise `ArrowInvalid` when a snapshot has no manifestsPeut-être pris @YuangGao l’a pris il y a 10 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/iceberg-python#4269 ·
Les mainteneurs répondent en général sous 1 jour
-
`inspect.entries()` raises TypeError when a data file has no column_sizesPeut-être pris @Rahul-cs50 l’a pris il y a 14 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/iceberg-python#4186 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
`older_than` reads a naive datetime as UTC and expires snapshots it should keepPeut-être pris @Rahul-cs50 l’a pris il y a 13 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/iceberg-python#4182 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
REST: Send empty first-page pageToken when rest-page-size is setPeut-être pris @ehddnr301 l’a pris il y a 32 jours. Ouvertekind:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
apache/iceberg-python#4096 ·
Les mainteneurs répondent en général sous 1 jour
-
PyArrowFileIO: every small S3 write is a 3-request multipart upload; expose allow_delayed_openPeut-être pris @David-Banquet l’a pris il y a 29 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
apache/iceberg-python#4093 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/iceberg-python
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
glossyio/traffic-monitor#312 ·
Les mainteneurs répondent en général sous 1 jour
-
local devenv exampleOuvertedocumentation enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
es-ude/elastic-ai.creator#1046 ·
Les mainteneurs répondent en général sous 3 jours
-
ENH: permit cachetools >= 7Ouvertefeature request
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
confident-ai/deepteam#306 ·
Les mainteneurs répondent en général sous 1 jour
-
SslLibrary crashes with unhandled OSError: port/proto not found on non-standard SSL portsPeut-être pris @himanchalkaushale l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
OWASP/Nettacker#1884 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour