Undeleting things is an important use case in my opinion. We do this in our environment on a regular basis. In that light I'm not sure that it would be appropriate just to log the deletion and git rid of the row. I would like to see it go to an archival table where it is easily restored.
-Mike On Mon, Mar 10, 2014 at 3:44 PM, Joshua Harlow <harlo...@yahoo-inc.com>wrote: > Sounds like a good idea to me. > > I've never understood why we treat the DB as a LOG (keeping deleted == 0 > records around) when we should just use a LOG (or similar system) to begin > with instead. > > Does anyone use the feature of switching deleted == 1 back to deleted = > 0? Has this worked out for u? > > Seems like some of the feedback on > https://etherpad.openstack.org/p/operators-feedback-mar14 also suggests > that this has been a operational pain-point for folks (Tool to delete > things properly suggestions and such...). > > From: Boris Pavlovic <bpavlo...@mirantis.com> > Reply-To: "OpenStack Development Mailing List (not for usage questions)" < > openstack-dev@lists.openstack.org> > Date: Monday, March 10, 2014 at 1:29 PM > To: OpenStack Development Mailing List <openstack-dev@lists.openstack.org>, > Victor Sergeyev <vserge...@mirantis.com> > Subject: [openstack-dev] [all][db][performance] Proposal: Get rid of soft > deletion (step by step) > > Hi stackers, > > (It's proposal for Juno.) > > Intro: > > Soft deletion means that records from DB are not actually deleted, they > are just marked as a "deleted". To mark record as a "deleted" we put in > special table's column "deleted" record's ID value. > > Issue 1: Indexes & Queries > We have to add in every query "AND deleted == 0" to get non-deleted > records. > It produce performance issue, cause we should add it in any index one > "extra" column. > As well it produce extra complexity in db migrations and building queries. > > Issue 2: Unique constraints > Why we store ID in deleted and not True/False? > The reason is that we would like to be able to create real DB unique > constraints and avoid race conditions on "insert" operation. > > Sample: we Have table (id, name, password, deleted) we would like to put > in column "name" only unique value. > > Approach without UC: if count(`select .... where name = name`) == 0: > insert(...) > (race cause we are able to add new record between ) > > Approach with UC: try: insert(...) except Duplicate: ... > > So to add UC we have to add them on (name, deleted). (to be able to make > insert/delete/insert with same name) > > As well it produce performance issues, because we have to use Complex > unique constraints on 2 or more columns. + extra code & complexity in db > migrations. > > Issue 3: Garbage collector > > It is really hard to make garbage collector that will have good > performance and be enough common to work in any case for any project. > Without garbage collector DevOps have to cleanup records by hand, (risk to > break something). If they don't cleanup DB they will get very soon > performance issue. > > To put in a nutshell most important issues: > 1) Extra complexity to each select query & extra column in each index > 2) Extra column in each Unique Constraint (worse performance) > 3) 2 Extra column in each table: (deleted, deleted_at) > 4) Common garbage collector is required > > > To resolve all these issues we should just remove soft deletion. > > One of approaches that I see is in step by step removing "deleted" > column from every table with probably code refactoring. Actually we have 3 > different cases: > > 1) We don't use soft deleted records: > 1.1) Do .delete() instead of .soft_delete() > 1.2) Change query to avoid adding extra "deleted == 0" to each query > 1.3) Drop "deleted" and "deleted_at" columns > > 2) We use soft deleted records for internal stuff "e.g. periodic tasks" > 2.1) Refactor code somehow: E.g. store all required data by periodic task > in some special table that has: (id, type, json_data) columns > 2.2) On delete add record to this table > 2.3-5) similar to 1.1, 1.2, 13 > > 3) We use soft deleted records in API > 3.1) Deprecated API call if it is possible > 3.2) Make proxy call to ceilometer from API > 3.3) On .delete() store info about records in (ceilometer, or somewhere > else) > 3.4-6) similar to 1.1, 1.2, 1.3 > > This is not ready RoadMap, just base thoughts to start the constructive > discussion in the mailing list, so %stacker% your opinion is very > important! > > > Best regards, > Boris Pavlovic > > > _______________________________________________ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > >
_______________________________________________ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev